条件测试命令:
test命令 == [ 命令,bash的内建命令;
格式:
test expression
[ expression ] 必须有空格,因为'[', ']'是两个参数,参数之间要用空格隔开;
[[:bash的关键字,一般仅用于某些其他特定结构或这类格式中;
` expression `
注意:此类条件测试命令一般没有执行结果,仅有执行状态返回值;如果其执行状态返回值为0,则表示true;如果执行状态返回值为1,则表示false;
[root@localhost ~]# [ 1 = 2 ]
[root@localhost ~]# echo $? ---返回值为1,为假
1
条件测试命令共有三类:
1.数值测试:双目操作(要进行两个参数的比较);
测试操作符:
-eq:测试两个数值是否相等;相等为真,不等为假;
[root@localhost ~]# [ 1 -eq 2 ]
[root@localhost ~]# echo $? ---不等为假,返回值为1
1
-ne:测试两个数值是否不等;不等为真,相等为假;
[root@localhost ~]# [ 1 -ne 2 ]
[root@localhost ~]# echo $? ---不等为真,返回值为0
0
-lt:less then,少于,测试左边的数值是否小于右边的数值;小于为真,不小于为假;
[root@localhost ~]# [ 1 -lt 2 ]
[root@localhost ~]# echo $? ---不小于为真,返回值为0
0
-gt:大于,测试左边数值是否大于右边数值;大于为真,不大于为假;
[root@localhost ~]# [ 1 -gt 2 ]
[root@localhost ~]# echo $? ---不大于为假,返回值为1
1
-le:小于等于,测试左边的数值是否不大于右边的数值;如果不大于为真,大于为假;
[root@localhost ~]# [ 1 -le 1 ]
[root@localhost ~]# echo $? ---不大于为真,返回值为0
0
-ge:大于等于,测试左边的数值是否不小于右边的数值;不小于为真,小于为假;
[root@localhost ~]# [ 1 -ge 0 ]
[root@localhost ~]# echo $? ---不小于为真,返回值为0
0
注意:bash仅支持整数,不支持浮点数(诸如3.1415926)
[root@localhost ~]# [ 1.787878 -ge 0 ]
-bash: [: 1.787878: 期待整数表达式
例子:
查看用户cl的uid是否大于等于1000,大于则输出Commmon User,小于等于则输出System User;其中
test == [ ] 参数之间要有空格
[root@localhost ~]# test $(id -u cl) -ge 1000 && echo "Commmon User" || echo "System User"
Commmon User
[root@localhost ~]# [ $(id -u cl) -ge 1000 ] && echo "Commmon User" || echo "System User"
Commmon User
判断文件num1.txt是否大于1000个字节,大于则是It's a bigfile.,否则输出It's a smallfile.。
[root@localhost ~]# [ $(stat -c %s num1.txt) -ge 1000 ] && echo "It's a bigfile." || echo "It's a smallfile."
It's a smallfile.
2. 字符串测试:
双目测试:
==(通常写两个等号)或者=:测试两个字符串是否为相同的字符串;相同为真,不同为假;
[root@localhost ~]# [ a == a ]
[root@localhost ~]# echo $? ---相同为真,返回值为0
0
!=:测试两个字符串是否为不同的字符串;不同为真,相同为假;
[root@localhost ~]# [ a != a ]
[root@localhost ~]# echo $? ---相同为假,返回值为1
1
>:测试左边的字符串所对应的ASCII编码是否比右边对应的ASCII编码大;大于为真,小于为假;
[root@localhost ~]# [[ a > b ]]
[root@localhost ~]# echo $? ---在对应的ASCII编码中,a的位置在b的前边,所以返回值为 1 1,假
<:测试左边的字符串所对应的ASCII编码是否比右边对应的ASCII编码小;小于为真,大于为假;
[root@localhost ~]# [[ a < b ]]
[root@localhost ~]# echo $? ---在对应的ASCII编码中,a的位置在b的前边,所以返回值为0
0
STRING =~ PATTERN:测试左侧的字符串能否被右边的模式pattern匹配;能匹配为真,不能匹配为假;
[root@localhost ~]# NEWVAR= ---定义NEWVAR= (空)
[root@localhost ~]# [[ NEWVAR =~ [^[:digit:]] ]] ---判断NEWVAR是否是非十进制数字
[root@localhost ~]# echo $? ---结果匹配为真,返回值为0
0
注意:>,<,=~这三类测试操作符只能用在` expression `测试语句中。
单目测试:
-z 'STRING':测试string字符串是否为空字符串;空串为真,不空为假;
[root@localhost ~]# NEWVAR=122
[root@localhost ~]# [ -z NEWVAR ]
[root@localhost ~]# echo $? ---定义的NEWVAR为122,所以返回值为1假
1
-n 'STRING':测试string字符串是否为非空串;不空为真,空串为假;
注意:1、通常情况下,字符串是要用引号引用的,单引号或双引号都可以;只有在特定的场合或情况下,只能选择单引号或双引号其中一个;
2、[]和[[]]在某些情况下,意义不完全相同,要区分对待;
3、如果使用[]或[[]]进行条件判断,在表达式的两端都留有空白字符,以区分命令和参数之间的关系;
4、所有的双目操作符和参数之间也要留有空白字符空间;
文件测试:
单目测试(较常用):
-a或者-e FILE:测试文件是否存在;存在为真,不存在为假;
[root@localhost ~]# [ -a num1.txt ]
[root@localhost ~]# echo $? ---文件存在,为真,返回值为0
0
-b FILE:测试文件是否存在且为块设备文件;存在且为块设备为真,否则为假;
[root@localhost ~]# [ -b num1.txt ]
[root@localhost ~]# echo $? ---文件存在,但是属于非块儿设备,假,返回值为1
1
-c FILE:测试文件是否存在且为字符设备;存在且为字符设备为真,否则为假;
[root@localhost ~]# [ -c ID.sh ]
[root@localhost ~]# echo $? ---ID.sh明显为脚本文件,所以存在但为假,返回值为1
1
-d FILE:测试文件是否存在且为目录文件;存在且为目录文件为真,否则为假;
[root@localhost ~]# [ -d /tmp ]
[root@localhost ~]# echo $? ---根下的文件tmp,文件存在且为目录文件为真,返回值为0
0
-f FILE:测试文件是否存在且为普通文件;存在且为普通文件为真,否则为假;
[root@localhost ~]# [ -f num1.txt ]
[root@localhost ~]# echo $? ---存在且为普通txt文件,返回值为0
0
-h或-L FILE:测试文件是否存在且为符号链接文件;存在且为符号链接文件为真,否则为假;
[root@localhost ~]# [ -h num1.txt ]
[root@localhost ~]# echo $? ---存在但非符号链接文件,假,返回值为1
1
-s FILE:测试文件是否存在且其大小大于0;存在且其大小大于0为真,否则为假;
[root@localhost ~]# [ -s num1.txt ]
[root@localhost ~]# echo $? ---存在且大小大于0,真,返回值为0
0
-S FILE:测试文件是否存在且为套接字文件;存在且为套接字文件为真,否则为假;
[root@localhost ~]# [ -S num1.txt ]
[root@localhost ~]# echo $? ---虽然存在但不为套接字文件,假,返回值1
1
-t FD FILE:测试文件描述符是否在终端上被打开;存在且在终端上被打开为真,否则为假;
文件的访问权限测试:
-r FILE:测试文件是否存在且当前用户是否被授予读取权限;存在且授权为真,否则为假;
[root@localhost ~]# su - cl
上一次登录:二 9月 19 04:01:51 CST 2017:0 上
[cl@localhost ~]$ [ -r num1.txt ]
[cl@localhost ~]$ echo $? ---更换用户cl,未授予该用户读权限,假,返回值1
1
-w FILE:测试文件是否存在且当前用户是否被授予写权限;存在且授权为真,否则为假;
[cl@localhost ~]$ [ -w num1.txt ]
[cl@localhost ~]$ echo $? ---更换用户cl,未授予该用户写权限,假,返回值1
1
-x FILE:测试文件是否存在且当前用户是否被授予执行权限;存在且授权为真,否则为假;
[cl@localhost ~]$ [ -x num1.txt ]
[cl@localhost ~]$ echo $? ---更换用户cl,未授予该用户执行权限,假,返回值1
1
文件特殊权限标识测试:
-u FILE:测试文件是否存在且设置了SUID;存在且授权为真,否则为假;
-g FILE:测试文件是否存在且设置了SGID;存在且授权为真,否则为假;
-K FILE:测试文件是否存在且设置了STICKY;存在且授权为真,否则为假;
文件的所有权测试:
-O FILE:测试文件是否存在且其属主是否为当前有效用户;存在且属主为当前有效用户为真,否则为假;
[root@localhost ~]# [ -O num1.txt ]
[root@localhost ~]# echo $? ---root下,测试是否当前有效用户,真,返回值0
0
-G FILE:测试文件是否存在且其属组是否为当前有效用户的所在组;存在且属主为当前有效用户的所在组为真,否则为假;
[root@localhost ~]# su - cl
上一次登录:三 11月 22 17:19:11 CST 2017pts/0 上
[cl@localhost ~]$ [ -G num1.txt ]
[cl@localhost ~]$ echo $? ---切换用户cl,非当前有效用户的所在组,假,返回值1
1
双目测试:
FILE1 -ef FILE2 :测试两个文件是否拥有相同的Inode编号;即:两个文件是否为硬连接;是硬连接为真,否则为假;
[root@localhost ~]# [ newtest -ef test ]
[root@localhost ~]# echo $?
1
测试语句中添加逻辑运算符号:
1.利用bash的逻辑运算符号:
[ expression1 ] && [ expression2 ]
[ expression1 ] || [ expression2 ]
![ expression ]
示例:
判断用户cl是否存在,并输出相应内容。
[root@localhost ~]# ! [ id cl &> /dev/null ] && echo "user is alive." || echo "no user."
user is alive.
2.利用条件测试命令本身的逻辑运算符号:
[ expression1 -a expression2 ] \\与&&类似
[ expression1 -o expression2 ] \\与||类似
[ ! expression ] \\与![ expression ]类似,!位置不一样,含义不一样,但 \\是作用相同
命令的执行结果:
1.命令的正常输出结果;
2.命令的执行状态返回值;
0-255
0:表示命令执行成功或条件判断为真;
1-255:表示命令执行失败或条件判断为假;
1,2,127:系统默认保留的;
3-126,128-255:用户自定义的命令执行状态返回值;
exit命令:
exit the shell
格式:exit [n]
退出shell时可以使用n作为状态返回值;如果没有指定n,则默认的状态返回值为最后一条命令的状态返回值;
注意:当shell脚本运行时,一旦遇到exit命令将立即结束当前运行此脚本的shell进程,同时此脚本的运行也会停止,其后续的所有命令都不会再被解释执行;因此,包含了exit命令的脚本,不要使用source命令来执行。
转载于:https://blog.51cto.com/chenliangdeeper/1983980