1、运算符
- 算数运算符:加+ 、减— 、乘 、除/ 、取余% 、赋值= 、 等于== 、不等于!
- 关系运算符:大于等于-ge、大于-gt、小于等于-le、小于-lt、等于-eq、不等于-ne (关系运算符只支持数字并且是整数,不支持字符串,除非字符串的值是数字)
- 布尔运算符:与-a 、或-o 、非! 、异或^
- 逻辑运算符:与&&、或||
- 字符串运算符:字符串长度是0为真-z 、字符串长度不是0为真-n 、相等== 、不相等!=
- 文件测试运算符: 文件(包括目录)存在-e 、文件为空(文件大小为0)-s
普通文件(既不是目录,也不是设备文件)-f 、目录-d
块设备文件-b 、字符设备文件-c、文件是有名管道(pipe 或是 FIFO)-p
可读-r 、可写-w 、可执行-w
设置了SGID位-g 、设置了SUID位-u 、设置了粘着位(Sticky Bit)-k *
2、条件测试的表达式
— test 选项 参数 — [ 选项 参数 ] ----> [[ 选项 参数 ]] 所有字符与运算符直接用“空格”分开,不能连到一起。[[ ]] 支持正则。 test提供一种检测if-then语句中不同条件的方法,如果test命令中列出的条件评估值为true,test命令以0状态码退出。 条件测试操作本身不显示出任何信息。测试的条件是否成立主要体现在命令执行后的返回状态(即 $?),所以可以在测试后查看变量$?的值来做出判断,或者结合&&、||等逻辑操作显示出结果(或作其他操作)
3、使用运算符做条件测试
<1> 整数值比较
使用关系运算符(-ge -gt -lt -le -eq -ne),这里是不能使用大于>,小于<的。
在[ ]表达式中,shell会将他们当做重定向符号,若想使用,大于和小于符号一定要转义,加上转义符号\,即 > 和 <
而[[ ]]表达式,只是对[ ]的扩充,能够支持大于>、小于<运算,不需要转义
案例1:对数值10、数值20判断比较
[ 10 -lt 20 ] 或 [ 10 < 20 ] 或 [[ 10 < 20 ]]
实际应用中,常用于给变量赋值,然后跟特定数值比较
案例2:监控本机内存剩余空间,判断剩余内存是否小于500M mem_size=$(free |awk '/Mem/{print $4}') //提取内存剩余空间,赋值变量 if [ $men_size -le 512000 ] //内存提取的空间大小是以 Kb 为单位 then echo "内存不足" else echo "内存充足" fi
<2> 字符串比较 使用字符串运算符(==、 !=、 -z、 -n) 常用于检测变量是否与某字符串匹配,如环境变量$USER;检测变量是否设置-z等 案例1:检测本机当前用户是否为超级管理员 [ $USER == "root" ] //测试 echo $? 注意:=虽然有相等的意思,但是它一般表示赋值,所以判断尽量使用==
<3> 检测文件/目录的各种属性 使用文件测试运算符(-e -d -f -r -w -x 等) 案例1:测试备份目录是否存在,不存在则自动创建该目录 [ ! ‐d /mysqlbackup ] && mkdir /mysqlbackup
<4> 多个条件/操作的逻辑组合(与、或、非、异或) 与(-a、&&):当两边同为真的时候,结果为真 或(-o、 || ):当两边都为假的时候,结果为假。 非( ! ) :取反 异或( ^ ) :当左右都相同的时候,结果为假;当左右不相同的时候,结果为真 在[ ]表达式中,多条件的逻辑组合使用布尔运算符(!、-o、-a),不支持 && 、 || 在[[ ]]表达式中,多条件的逻辑组合使用逻辑运算符(&& 、||),不支持 -a 、 -o 案例1:监控本机内存和硬盘剩余空间,判断剩余内存是否小于 125M、根分区剩余空间是否小于 1000M disk_size=$(df / |awk '///{print $4}') //提取根分区剩余空间 mem_size=$(free |awk '/Mem/{print $4}') //提取内存剩余空间 if [ $disk_size ‐le 1024000 ‐a $mem_size ‐le 128000 ];then echo "内存和硬盘剩余空间不足" else echo "一切OK" fi 或 者使用双中括号 [[ ]]表达式进行条件测试 [[ $disk_size < 1024000 && $mem_size < 128000 ]]