bash之条件测试:
条件测试:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
COMMAND
测试表达式:
整数测试:A, B
A -gt B: 大于
A -ge B: 大于等于
A -eq B: 等于
A -lt B: 小于
A -le B: 小于等于
A -ne B: 不等于
当判断与整数相关的条件时 如上图:通过判断用户ID大小,来确定用户是管理员还是普通用户还是系统用户。UID为0时 是root管理员,UID小于500为系统用户,UID大于500的都为普通用户。
字符串测试:A, B
A > B
A < B
A >= B
A <= B
A == B或A = B:等值比较
A != B: 不等于
-z A: 判断A是否为空;空则为真,不空则假;
-n A:判断A是否不空;不空则为值,空则为假;
条件测试语法:if / then
单分支:
if CONDITION-TURE; then
CMD1
CMD2
...
fi
if可以嵌套:
if CONDITION1; then
if CONDITION2; then
CMD
fi
fi
条件取反:! CONDITION
双分支:
if CONDITION-TRUE; then
分支1
else
分支2
fi
如果$stat为no 或n时 则显示echo“停止脚本”,否则else执行echo语句。
多分支的if语句:
if CONDITION1-TRUE; then
分支1
elif CONDITION2-TRUE; then
分支2
elif CONDITION3-TRUE; then
分支3
...
else
分支n
fi
同时判断两个条件时可使用多分支if语句,如上图所示,先判断httpd服务是否开启,elif再判断nginx是否开启。如果开启则用netstat -ntpl命令查看服务所在端口,不存在时则echo显示没有开启服务。
COMMAND用作条件:
(1) 使用命令执行结果;(a) 使用命令引用
(b) 使用比较操作符
例如:[ `id -u $username` -lt 500 ]
userid=`id -u $username`
[ $userid -lt 500 ]
(2) 使用命令的退出状态码:(a) 先运行命令;
(b) 退出状态码
引用方式两种:
(a) if COMMAND; then
注意:COMMAND不能被命令引用;COMMAND的执行结果通常没有意义,所以其结果通常(&>)被定向至/dev/null
(b) 先执行命令,后判断退出状态码是否为0
COMMAND
if [ $? -eq 0 ]
条件测试:字符串测试:=~
"$A" =~ PATTERN
如果变量A中保存的字符串能被PATTERN所匹配;即为真;否则为假;
文件测试:$file
-e $file: 是否存在;存在则为真;
-a $file: 同上;弃用;
-f $file: 文件是否存在,且为普通文件;
-d $file: 是否存在且为目录;
-h $file: 是否存在且为符号链接文件;
-L $file:是否存在且为符号链接文件;
-b $file: 是否存在且为块设备文件;
-c $file: 是否存在且为字符设备文件;
-S $file: 是否存在且为套接字文件:
-p $file: 是否存在且为管道文件;
-r $file: 当前用户对此文件是否拥有读权限;
-w $file: 当前用户对此文件是否拥有写权限;
-x $file: 当前用户对此文件是否拥有执行权限;
-u $file: 文件是否拥有suid权限;
-g $file:文件是否拥有sgid权限;
-k $file: 文件是否拥有sticky权限;
-O $file: 当前用户是否为文件的属主;
-G $file: 当前用户是否属于文件的属组;
-N $file: 文件自从上一次被读取之后,是否被修改过;
$f1 -nt $f2: 文件f1是否比文件f2新;
$f1 -ot $f2: 文件f1是否比文件f2旧;
$f1 -ef $f2: f1和f2是否为同一个文件的硬链接;
组合测试条件:
给条件添加逻辑操作符;
或, -o: [ -z "$hostname" -o "$hostname" == 'localhost' ]
与, -a: [ $uid -gt 0 -a $uid -lt 500 ]
非:[ ! EXPRESSION ]
判断字符串是否为yes |no 使用条件测试-o
短路操作符
与:COMMAND1 && COMMAND2
COMMAND1的退出状态如果为假,则COMMAND2不用运行,即可有最终结果;
或:COMMAND1 || COMMAND2
COMMAND1的退出状态如果为真,则COMMAND2不用运行,即可有最终结果;
非:! COMMAND
[ ! -d /tmp/test ] && mkdir /tmp/test
[ -d /tmp/test ] || mkdir /tmp/test