bash编程之:条件测试

日期: 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,测试二者是否为硬链接


 

示例:

wKiom1X3KrDByM_YAAH3x-PPoFA670.jpg

        

        

总结:

 

关于条件测试,单中括号 [ ] 与双中括号 [[ ]] 的区别:

 

通常,在比较变量赋值时建议使用 [ ],比较变量的赋值时,变量务必加双引号,

在比较纯字符串时建议使用[[ ]],字符串比较,比较符号两端最好都有空格

 

在[[]]中可以使用通配符进行匹配。&& || > < =~等符号可以应用与[[]]中,但不能用于[]中

 

字符串测试:

=比较两个字符串是否相同,与==等价,比如: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 ]

 

示例:

wKioL1X3LOSgDs9YAAGKBK7DYM4925.jpg



命令组合:

与: 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"

wKiom1X3KrCgvKY-AACQau6J03c915.jpg


 

 


你可能感兴趣的:(逻辑运算,条件测试,文件测试,字符测试,整数测试)