之前和大家说了一些shell编程的基本知识,现在和大家来说一说bash的条件测试语句。

条件测试时会用到的命令为test命令:

test命令 == [ 命令,bash的内建命令;

格式:

test expression

[ expression ]


[[:bash的关键字;一般仅用于某些特定结构或者格式之中;

[[ expression ]]


注意:此类条件测试命令一般没有执行结果,仅有执行状态返回值;如果其状态返回值为0,则表示true;如果其状态返回值为1,则表示false;


条件测试命令共有三类条件测试表达式:数值测试、字符串测试、文件测试。


1.数值测试:双目操作;

测试操作符:

-eq:测试两个数值是否相等;相等为真,不等为假;

-ne:测试两个数值是否不等;不等为真,相等为假;

-lt:less than,小于,测试左边的数值是否小于右边的数值;小于为真,不小于为假;

-gt:大于,测试左边的数值是否大于右边的数值;大于为真,不大于为假;

-le:小于等于,测试左边的数值是否不大于右边的数值;不大于为真,大于为假;

-ge:大于等于,测试左边的数值是否不小于右边的数值;不小于为真,小于为假;


[root@localhost ~]# test 500 -eq 400 && echo "相等" || echo "不相等"
不相等
[root@localhost ~]# test $(id -u xwl ) -ge 1000 && echo "comman user" || echo "sys user"
comman user
[root@localhost ~]# test $(id -u xwl ) -ne 1000 && echo "comman user" || echo "sys user"
sys user
[root@localhost ~]# test  $(stat -c %s a.txt) -lt 500 && echo "small file"
small file
[root@localhost ~]# test 500 -gt 400 && echo "大于" || echo "不大于"
大于
[root@localhost ~]# test 300 -le 400 && echo "小于" || echo "不小于"
小于

注意:bash仅支持整数,不支持浮点数;



2.字符串测试:


双目测试:

== | =:测试两个字符串是否为相同的字符串;相同为真,不同为假;

!=:测试两个字符串是否为不同的字符串;不同为真,相同为假;

>:测试左边的字符串所对应的ASCII编码是否比右边的字符串的ASCII编码大;大于为真,小于为假;

< :测试左边的字符串所对应的ASCII编码是否比右边的字符串的ASCII编码小;小于为真,大于为假;

STRING =~ PATTERN:测试左侧的字符串能否被右边的PATTERN匹配,能匹配为真,不能匹配为假;


注意:>,<,=~这三类测试操作符只能用在[[ expression ]]测试语句中;



[root@localhost ~]# [ $USER == root  ]  && echo "hello"  || echo "Pleas get out "
hello
[root@localhost ~]# [ $USER != root  ]  && echo "Get out"  || echo "hello "
hello 
[root@localhost ~]# [[ A > B ]] 
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ A < B ]] 
[root@localhost ~]# echo $?
0
[root@localhost ~]# MYVAR=123
[root@localhost ~]# [[ $MYVAR =~ [^[:digit:]] ]] || echo "$MYVAR is a pure digiy"
123 is a pure digiy

        单目测试:

-z 'STRING':测试STRING是否为空字符串;空串则为真,不空为假;

-n 'STRING':测试STRING是否为非空串;不空为真,空串为假;

[root@localhost ~]# [ -n $MYVAR ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -z $MYVAR ]
[root@localhost ~]# echo $?
1

注意:

(1)通常情况下,字符串是要用引号引用的,单引号或双引号都可以,只有在特定的情况下,只能选择单引号或双引号其中的一个;

(2)[]和[[]]在某些情况下,意义不完全相同,要区分对待;

(3)如果使用[]或[[]]进行条件判断,在表达式的两端都要留有空白组赴,以区分命令和参数之间的关系;

(4)所有的双目测试操作符和参数之间也要留有空白字符空间;



3.文件测试

单目测试:

-a | -e FILE:测试文件是否存在;存在为真,不存在为假;


[root@localhost ~]# [ -a a.txt  ]
[root@localhost ~]# echo $?
0


-b FILE:测试文件是否存在且为块设备的文件;存在且为块设备为真,否则为假;


[root@localhost ~]# [ -b a.txt ]
[root@localhost ~]# echo $?
1


-c FILE:测试文件是否存在且为字符设备的文件;存在且为字符设备,否则为假;

[root@localhost ~]# [ -c a.txt ]
[root@localhost ~]# echo $?
1


-d FILE:测试文件是否存在且为目录文件;存在且为目录文件为真,否则为假;


[root@localhost ~]# [ -d abc ]
[root@localhost ~]# echo $?
0


-f FILE:测试文件是够存在且为普通文件;存在且为普通文件为真,否则为假;


[root@localhost ~]# [ -f a.txt ]
[root@localhost ~]# echo $?
0


-h|-L FILE:测试文件是否存在且为符号链接文件,存在且为符号链接文件为真,否则为假;



-s FILE:测试文件是够存在且其大小要大于0,存在且其大小大于0为真,否则为假;


[root@localhost ~]# [ -s a.txt  ]
[root@localhost ~]# echo $?
0


-S FILE:测试文件是否存在且为套接字文件;存在且为套接字文件为真,否则为假;


[root@localhost ~]# [ -S a.txt ]
[root@localhost ~]# echo $?
1

-t FD:测试文件描述符是否在终端上被打开,被打开为真,否则为假;



文件的访问权限测试:

-r FILE:测试文件是否存在且当前用户是否被授予读取权限,存在且授权为真,否则为假;


[root@localhost ~]# [ -r a.txt ]
[root@localhost ~]# echo $?
0


-w FILE:测试文件是否存在且当前用户是否被授予写权限,存在且授权为真,否则为假;


[root@localhost ~]# [ -w a.txt ]
[root@localhost ~]# echo $?
0


-x FILE:测试文件是否存在且当前用户是否被授予执行或搜索权限,存在且授权为真,否则为假;


[root@localhost ~]# [ -x a.txt ]
[root@localhost ~]# echo $?
1



文件特殊权限标识测试:

-u FILE:测试文件是否存在且设置了SUID,存在且授权为真,否则为假;

-g FILE:测试文件是否存在且设置了SGID,存在且授权为真,否则为假;

-k FILE:测试文件是否存在且设置了年制位STIKEY,存在且授权为真,否则为假;


[root@localhost ~]# [ -u a.txt ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -k a.txt ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -g a.txt ]
[root@localhost ~]# echo $?
1


文件的所有权测试:

-O FILE:测试文件是否存在且其属主为当前有效用户;文件存在且属主为有效用户为真,否则为假;

-G FILE:测试文件是否存在且其属组为当前有效用户;文件存在且属组为有效用户的所属组为真,否则为假;


[root@localhost ~]# [ -O a.txt ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -G a.txt ]
[root@localhost ~]# echo $?
0




双目测试:

FILE1 -ef FILE2:测试两个文件否拥有相同的INODE编号;即:两个文件是否互为硬链接;

FILE1 -nt FILE2:前面文件是否比后面文件新;即修改时间戳是否更晚;

FILE1 -ot FILE2:前面文件是否比后面文件旧;即修改时间戳是否更早;


测试语句中添加逻辑运算符号:

1.利用bash的逻辑运算符号:

[ expression1 ] && [ expression2 ]

[ expression1 ] || [ expression2 ]

![ expression1 ]


[root@localhost ~]# [ $USER == root  ] && [ -k a.txt ] || echo "You are so boring"

You are so boring


2.利用条件测试命令本身的逻辑运算符号:

[ expression1 -a expression2 ]

[ expression1 -o expression2 ]

[ ! expression ]



命令的执行结果:

1.命令的正常输出结果:

2.命令的执行状态返回值:

0-255

0:命令成功执行或者条件判断为真;

1-255:命令执行失败或者条件判断为假;

1,2,127:系统默认保留的;

3-126,128-255:用户自定义的命令执行状态返回值;


exit命令:

exit the shell

格式:exit [n]

退出shell是可以使用n作为状态返回值;如果没有指定n,则莫问的状态返回值为最后一条命令的状态返回值;


[root@localhost ~]# vim a.sh
#!/bin/bash
#
[ -e /abc ] && echo "You are right" || exit 5
[root@localhost ~]# bash a.sh 
[root@localhost ~]# echo $?
5


注意:当SHell脚本运行时,一旦遇到exit命令,将立即结束运行此脚本的shell进程,同时此脚本的运行也会停止,其后续的所有                      命令都不会再被解释执行;因此,包含了exit命令的脚本,不要使用sorce命令来执行;


bash的颜色显示规则:

调用了ASCII编码对于颜色的设置方案:


输入Ctrl键编码:\033

[:控制字符和颜色代码之间的分隔符;

所有的颜色代码都应该使用m字符结尾;


颜色代码:

0:关闭颜色显示属性,恢复为黑白色;

1:加粗显示文本字符;

4:为文本字符下划线;

5:使文本字符闪烁;

7:将文本字符的背景颜色和前景色交换;

8:将文本字符的背景颜色设置为与前景色相同;


30-39:设置文本字符的前景色,38,39为保留,暂时未被使用;

40-49:设置文本字符的背景色,48,49为保留,暂时未被使用;



注意:此类控制字符和颜色代码必须放置在echo -e 模式中显示;


[root@localhost ~]# echo -e "\033[31m hello\033[0m"
 hello
 (变红)
 [root@localhost ~]# echo -e "\033[1;5;45;31m hello\033[0m"
 hello
 (加粗显示,并且加上背景色闪烁输出字符)