之前和大家说了一些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 (加粗显示,并且加上背景色闪烁输出字符)