目录
一、shell介绍
shell脚本(Shell Script)就是将要执行的命令按顺序保存到一个文本文件,并给该文件可执行权限,方便一次性执行的一个程序文件。主要是方便管理员进行设置或管理,可结合各种Shell控制语句完成更复杂的操作。常用于重复性操作、批量事务处理、自动化运维、服务运行状态监控、定时任务执行等。
/bin/bash是目前大多数Linux版本采用的默认Shell脚本。
新建脚本以.sh结尾
- shell脚本应用场景:
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时执行任务
1、 创建一个简单的脚本
切换目录
脚本的运行方式
- sh [文件名] 运行 用于运行期间,调试阶段
- bash [文件名] 运行 用于运行期间,调试阶段
- source [文件名] 执行 用于运行期间,调试阶段
- ./[文件名] 需要执行权限 ,需要通过chmod 777,赋权执行,一旦正式上线,要给执行权限运行。
脚本文件在命名的时候要以“.sh”结尾。
交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行无=出错误信息
2.重定向操作
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据 |
重定向输出 | > >> | 将输出结果保存到指定文件(覆盖原内容) 将数据结果追加到指定文件(不覆盖原内容) |
重定向错误输出 | 2> 2>> | 将错误信息保存到指定的文件(覆盖原有内容) 将错误信息追加到指定的文件中 (不覆盖原有的内容) |
混合输出 | &> | 将标准输出,标准错误内容保存到同一个文件中 |
黑洞文件 /dev/null
cat /dev/null >[文件名] 不删除文件,清空文件
二、shell变量、类型
变量名:使用固定的名称,由系统内设,或者是用户自己进行自定义
变量值:能够根据用户设置,系统环境的变化而变化
自定义变量:由用户自己定义,修改和使用。
特殊变量:环境变量,只读变量,位置变量,预定义变量
打印变量的值,前面要加 "$" 例如:echo $[变量名]
引用变量时,在变量前面也要加 “$” ,例如:$[变量名]
1.变量名的规范
- 不能使用系统的命令作为变量名
- 不能使用中午
- 不能以特殊符号开通 ,例如:#、$、%、()、+、*、等
- 可以使用"_"下划线开头
- 有必要时,需要注释
2.变量类型
整数 :int
字符串:string
布尔类型:0 1 是与否
浮点:小数
只读变量:readoly
3.强引用与弱引用
在赋值变量时,单引号与双引号没有区别
打印变量时:
双引号:弱引用,还是原来的值,不变 ""
单引号:强引用,就不是原来变量的值,就变成单引里面的内容$[变量名],变成了字符串''
反撇号:提取命名执行的结果,然后再给变量赋值 ``
命令 read
reda -p "提示信息" [变量名]
4.全局变量
所有的用户自定义变量在所有的子shell环境都可以使用
优点:全局范围、持久性、共享性、持久性、
缺点:如果相同的变量名,直接引用全局变量,会导致不确定性,在脚本中一般使用自定义变量。
整数运算
expr 1 + 2 加法
expr 1 - 2 减法
expr 1 \* 2 乘法
expr 1 / 2 除法
expr 1 % 2 求余
C=$((1+2)) <<====>> C=$[1*2] <<====>> let c=12*8
i++ 先赋值,再加 i++ <===> i+=1
i-- 先赋值,再减 i-- <====> i-=1
++i 先加,再赋值
--i 先减,在赋值
bc linux计算器,支持整数,也支持浮点
整数
[root@test1 /]# echo 4*4 | bc
16
[root@test1 /]# echo 4-4 | bc
0
[root@test1 /]# echo 4+4 | bc
8
[root@test1 /]# echo 4%4 | bc
0
浮点
[root@test1 /]# echo 8.5*6.2 | bc
52.7
[root@test1 /]# echo 8.5-6.2 | bc
2.3
[root@test1 /]# echo 8.5+6.2 | bc
14.7
[root@test1 /]# echo 8.5/6.2 | bc
1
5.环境变量 env
env :查看当前工作下的全部环境变量
系统自带,用于设置工作环境,配置系统行为传递信息,控制
[root@test1 /]# env
XDG_SESSION_ID=374
HOSTNAME=test1
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.234.1 60673 22
SELINUX_USE_CURRENT_RANGE=
OLDPWD=/opt
SSH_TTY=/dev/pts/1
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
SSH_CONNECTION=192.168.234.1 60673 192.168.234.123 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
DISPLAY=localhost:11.0
_=/usr/bin/env
echo $PATH 查看可执行用户程序的默认路径
echo $USER 表示用户的宿主目录
echo $LANG 表示语言和字符集
echo $PWD 表示当前所在工作目录
6.位置变量
命令变量:命令参数,运行脚本或程序时,传递给他们的值,位置变量用于将外部数据传递给脚本执行。
[root@test1 opt]# cat adder2num.sh
1 #!/bin/bash
2 sum=`expr $1 + $2`
3 echo "$1 + $2 =$sum"
[root@test1 opt]# sh adder2num.sh 12 34
12 + 34 =46
7.预定义变量
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量进行赋值。预定义变量使用“$”符号和另一个符号组合表示,较常用的几个预定义变量的含义如下:
- $#:表示命令行中位置参数的个数
- $*:表示所有位置参数的内容
- $?表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
- $0:表示当前执行脚本或程序的名称
$0
$?
三、$* 与$@的区别
有无“” | $* | $@ |
有 | 把内容处理在一行 | 把内容分行处理 |
没有 | 将内容分行处理 | 将内容分行处理 |