日期: 2015年09月13日
<<========================================【条件测试】========================================>>
条件测试
bash的条件测试主要有以下3类:
整数测试:比较两个整数谁大谁小,是否相等;
字符测试:比较两个字符串是否相等;
文件测试:测试某个文件是否具有读权限、写权限、执行权限等;
(1) 根据运行的命令的状态结果判断
(2) 在bash中进行条件测试的方式通常有三种:
test EXPRESSION
[ EXPRESSION ] ==>两边必须要有空格,否则语法错误
[[ EXPRESSION ]] ==>两边必须要有空格,否则语法错误
其中"["是启动测试命令,但要求在expression后要有一个"]"与其配对。使用该命令要特别注意"["后和"]"前的空格必不可少。
字符串比较时建议字符串变量要使用双引号,即使变量为空,也要使用双引号。
所有的测试条件都通过布尔值:(真、假) 来判定测试结果
真,假 (对于命令状态返回值来讲,0是真,其他数值都是假)
通过 echo $? 可获得上一条命令的执行状态;
状态用数字来表示:0-255;
0: 成功
1-255: 失败 (1、2、127 是系统预留的)
整数测试: A=100 B=101
[[ "$A" -gt "$B" ]]: 测试A的变量赋值是否大于B的变量赋值,是则为"真",否则为"假"
[[ "$A" -ge "$B" ]]: 测试A的变量赋值是否大于等于B的变量赋值,是则为"真",否则为"假"
[[ "$A" -lt "$B" ]]: 测试A的变量赋值是否小于B的变量赋值,是则为"真",否则为"假"
[[ "$A" -le "$B" ]]: 测试A的变量赋值是否小于等于B的变量赋值,是则为"真",否则为"假"
[[ "$A" -eq "$B" ]]: 测试A的变量赋值是否等于B的变量赋值,是则为"真",否则为"假"
[[ "$A" -ne "$B" ]]: 测试A的变量赋值是否不等于B的变量赋值,是则为"真",否则为"假"
示例:
字符串测试:
ASCII数值越大,字符比较时其值越大
[[ ABC > ABC ]]: 左侧字符是否大于右侧字符
[[ ABC < ABC ]]: 左侧字符是否小于右侧字符
[[ ABC == ABC ]]: 左侧字符是否等于右侧字符
[[ ABC != ABC ]]: 左侧字符是否不等于右侧字符
[[ ABC =~ C ]]: 左侧字符串能否被右侧模式所匹配
示例:
单目测试:
只测试一个变量
[ -z "$name" ]: 测试变量赋值是否为空,空则为"真",否则为"假"
[ -n "$name" ]: 测试变量赋值是否不空,不空则"真",空则为"假"
示例:
文件测试:
测试文件的存在性以及属性:
-a /path/to/file:测试文件是否存在,存在为"真",否则为"假"
-e /path/to/file:测试文件是否存在,存在为"真",否则为"假"
-f /path/to/file:测试文件是否存在且为普通文件
-d /path/to/file:测试文件是否存在且为目录文件
-h /path/to/file:测试文件是否存在且为符号链接文件
-L /path/to/file:测试文件是否存在且为符号链接文件
-b /path/to/file:测试文件是否存在且为块设备文件
-c /path/to/file:测试文件是否存在且为字符设备文件
-S /path/to/file:测试文件是否存在且为套接字文件
-p /path/to/file:测试文件是否存在且为管道文件
-s /path/to/file:测试文件是否存在并且不空
-r /path/to/file:当前用户对文件是否拥有读权限
-w /path/to/file:当前用户对文件是否拥有写权限
-x /path/to/file:当前用户对文件是否拥有执行权限
-u /path/to/file:文件是否拥有SUID权限
-g /path/to/file:文件是否拥有SGID权限
-K /path/to/file:文件是否拥有sticky权限
-O /path/to/file:当前用户是否为指定文件的属主
-G /path/to/file:当前用户是否为指定文件的属组
双目操作符:
[ "$file1" -nt "$file2" ]: file1的最近一次修改时间戳是否晚于file2
[ "$file1" -ot "$file2" ]: file1的最近一次修改时间戳是否早于file2
[ "$file1" -ef "$file2" ]: file1与file2是否指向了同一个inode,测试二者是否为硬链接
示例:
总结:
★关于条件测试,单中括号 [ ] 与双中括号 [[ ]] 的区别:
通常,在比较变量赋值时建议使用 [ ],比较变量的赋值时,变量务必加双引号,
在比较纯字符串时建议使用[[ ]],字符串比较,比较符号两端最好都有空格
在[[]]中可以使用通配符进行匹配。&& || > < =~等符号可以应用与[[]]中,但不能用于[]中
字符串测试:
=比较两个字符串是否相同,与==等价,比如:if [ "$a" = "$b"],变量要加双引号
若字符串中间有空格或*号等特殊符号时就容易出错,因此推荐使用格式:[ "${a}"="${b}" ]
常用字符串测试操作符:
-z "字符串" 若串长度为0则真,不为0则假,
如: [ -z "$abc" ]
-n "字符串" 若串长度不为0则真,为0则为假
如: [ -n "$abc" ]
[[ "串1"="串2" ]] 若串1等于串2则真,可以使用==代替=
[[ "串1"!="串2" ]] 若串1不等于串2则真, 但不能用!==代替!=
<<====================================【组合条件测试】====================================>>
组合条件测试
条件间逻辑运算:
与:多个条件要同时满足
或:多个条件满足其一即可
非:对指定的条件取反
表达式组合:
与: [[ CONDITION1 -a CONDITION2 ]]
或: [[ CONDITION1 -o CONDITION2 ]]
非: [ ! CONDITION ]
示例:
命令组合:
与: COMMAND1 && COMMAND2 <-- [ EXPR1 ] && [ EXPR2 ]
或: COMMAND1 || COMMAND2
非: ! COMMAND
逻辑运算:
与运算:(假和任何数相与都得假)
真 && 真 = 真
真 && 假 = 假
假 && 真 = 假
假 && 假 = 假
或运算:(真和任何数相或都得真)
真 || 真 = 真
真 || 假 = 真
假 || 真 = 真
假 || 假 = 假
非运算:(取反面)
! 真 = 假
! 假 = 真
短路操作符:对条件本身做逻辑运算
与:条件1 && 条件2
条件1为假,则最终结果一定为假,因此,条件2将不执行;
条件1为真,则最终结果取决于后面条件,因此,条件2必须执行;
或:条件1 || 条件2
条件1为真,则最终结果一定为真,因此,条件2将不再执行;
条件1为假,则最终结果取决于后面条件,因此,条件2必须执行;
非: ! 条件
示例:
id一个用户名,如果执行成功则显示该用户存在,如果id命令没有执行成功,则显示该用户不存在。
id $userName &> /dev/null&& echo "$userNmae exist." || echo "$userName notexist"