⑴ 首先讲讲介绍它的必要性:
在任何一种编程语言中,条件测试功能都是必不可少的。条件测试可以控制程序的控制流向和下一步的处理动作。是控制程序逻辑流向一个非常重要的方式。
而test条件测试语句,以其丰富的条件判断功能,0或1的出口返回状态,使其非常适合应用于条件测试语句。
⑵ test命令的作用对象(本篇博客也将从这四个方面进行说明):
①文件、
②字符串、
③整数、
④逻辑
⑶ test命令的等效方式:[ ] [[ ]]
一般是使用[[ ]],因为这样可以避免一些逻辑错误。
同时需要注意:[[…]]方括号和中间字符之间一定要有空格,并且方括号中间的表达式之间也要有空格。
比如:[[ $a=str ]] 中间是一个赋值等式了,恒成立状态。如果[[ $a = str ]]就是一个条件判断,所以要特别注意了。
同时区分[[…]]和((…)),((…))的用法:点击打开链接
接下来将介绍如何使用及一些选项:
文件测试主要指文件的状态和属性测试,可以用于判断一个语句,也可以用来判断两个文件之间修改时间的前后
⑴ 文件是否存在
[[ -e file ]]
⑵ 文件存在,且可读
[[ -r file ]]
⑶ 文件存在,且可写
[[ -w file ]]
⑷ 文件存在,且可执行
[[ -x file ]]
⑸ 文件存在,且其大小大于0
[[ -s file ]]
解析:通过文件大小,判断文件是否为空
⑹ 文件存在,且为普通文件(非目录或设备文件)
[[ -f file ]]
⑺ 存在,且是目录
[[ -d file ]]
⑻ 存在,且是符号连接
[[ -L file ]]
解析:符号连接(软连接),是指向另一个文件的一个文件。其与目录类似,符号连接也只能包含一种类型的数据。
⑼ 存在,且是字符特殊文件(如终端)
[[ -c file ]]
⑽ 存在,且是块特殊文件(如磁盘)
[[ -b file ]]
⑾ 存在,且是命令的管道文件
[[ -p file ]]
⑿ 存在,且设置了setuid标志位
[[ -u file ]]
解析:setuid标志位是超级用户为普通用户开通的文件访问权限,使普通用户在执行该文件时有超级用户的特权。
例如,如果没有系统文件/etc/shadow没有设置setuid标志位,则,普通用户无法用过passwd命令修改密码。
查看:可以用过ls –l /user/bin/passwd 进行查看是否设置。看输出访问权限字段有没有字符”s“
Setuid标志位可能造成安全隐患,但,在shell脚本中,setuid标志位没有影响。
??是因为关闭脚本时,自动把setuid复位了吗,还是说在脚本中设置的setuid标志位,作用用范围只是脚本的生命周期。
⒀ 存在,且设置了setgid标志位
[[ -g file ]]
解析:
⒁ 存在,且设置了粘性标志位
[[ -k file ]]
⑴ f1存在,比f2文件新;即f1修改时间后于f2最后的修改时间
[[ file1 –nt file2 ]]
⑵ f1存在,比f2文件旧;即f1修改时间先于f2最后的修改时间
[[ file1 –ot file2 ]]
⑶ f1、f2均存在,且指向同一个物理文件
[[ file1 –ef file2 ]]
最后,逻辑非运算符”!“,和上述表达式搭配使用
⑴ 长度为0
[[ -z string ]]
⑵ 长度大于0
[[ -n string ]]
⑴ 相等
[[ string1 = string2 ]]
注意:这个作为字符串相等比较的命令,等号两边必须有空格!!不然会被当做一个字符串。
举例:
① [[ name=chj ]] 这个出口状态永远为真,因为把它当做一个字符串,非0
② [[ name = chj ]] 这个出口状态为假
⑵ 不等
[[ string1 != string2 ]]
⑶ 小于
[[ string1 < string2 ]]
注意:如果这里用“[ ]”,则格式为”[ string1 \< string2 ]“,<前需要加转义符号\
⑷ 大于
[[ string1 > string2 ]]
注意:同3
比较前后两个数值的大小
⑴ 相等
[[ exp1 –eq exp2 ]]
⑵ 不相等
[[ exp1 –ne exp2 ]]
⑶ exp1 > exp2
[[ exp1 –gt exp2 ]]
⑷ exp1 < exp2
[[ exp1 –lt exp2 ]]
⑸ 大于等于
[[ exp1 –ge exp2 ]]
⑹ 小于等于
[[ exp1 –le exp2 ]]
举例:
实现功能:实现1000次hello的输出
代码如下:
num=1
while [[ `expr $num + 1` -le 1000 ]]
do
echo hello
num=`expr $num + 1`
done
分析:
[[ `expr $num + 1` -le 1000 ]]
`expr $num + 1` 是exp1表达式
1000 是exp2表达式
-le 是小于等于
注意:
expr $num + 1两端是反引号,也可以通过$(expr $num + 1)进行命令替换
⑴ 计算结果为真
[[ (expr) ]]
⑵ 计算结果为假
[[ ! expr ]]
⑶ 逻辑或
[[ exp1 –a exp2 ]] 或 [[ exp1 && exp2 ]]
⑷ 逻辑与
[[ exp1 –o exp2 ]] 或 [[ exp1 || exp2 ]]