您的位置:首页 > 运维架构 > Shell

bash编程之条件测试if/then

2014-12-04 21:12 393 查看
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]是否存在且为符号链接文件;[/b]
-b $file: 是否存在且为块设备文件;
-c $file: 是否存在且为字符设备文件;
-S $file: 是否存在且为套接字文件:
-p $file: 是否存在且为管道文件;

-r $file: 当前用户对此文件是否拥有读权限;
-w $file: [b]当前用户对此文件是否拥有写权限;[/b]
-x $file: [b]当前用户对此文件是否拥有执行权限;[/b]

-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  条件测试 if / then