shell中条件测试常用的语法(一)
执行条件测试表达式后通常会返回“真”或“假”,就像执行命令后的返回值为0表示真,非0表示假一样。在bash编程里,条件测试常用的语法形式如下:
说明:
(1)语法1与语法2是等价的,语法3是语法1的扩展;
(2)语法4常用于计算;
(3)在[[]](双中括号)中可以使用通配符等进行模式匹配,这是区别其他几种语法格式的地方;
(4)&&,||,>,<等操作符可以应用于[[]]中,在[]中一般用-a,-o,-gt(用于整数),-lt(用于整数),!= 代替上述操作符;
(5)对于整数的关系运算,也可以使用shell的算数运算符(())。
建议:工作中使用语法2!
常用的文件测试操作符
[root@ceshiji ~]# touch wtf
[root@ceshiji ~]# ll wtf
-rw-r--r-- 1 root root 0 10月 23 03:25 wtf
[root@ceshiji ~]# chmod 001 wtf
---------x 1 root root 0 10月 23 03:25 wtf
[root@ceshiji ~]# [ -r wtf ] && echo 1 || echo 0
1
[root@ceshiji ~]# [ -w wtf ] && echo 1 || echo 0
[root@ceshiji ~]# [ -x wtf ] && echo 1 || echo 0
说明:wtf这个普通文件没有可读可写的权限,为什么还会返回1呢?这是因为我们使用的是root账户的原因!所以,我们在测试一个文件的读,写,执行等属性,不光是根据文件属性rwx的标识来判断,还要看当前执行测试的用户是否真的可以按照对应的权限操作该文件。
变量的特殊写法和问题
[root@ceshiji ~]# echo $wtf
[root@ceshiji ~]# [ -e $wtf ] && echo 1 || echo 0
[root@ceshiji ~]# [ -e "$wtf" ] && echo 1 || echo 0
0
说明:变量wtf是不存在的,但[ -e $wtf ]直接判断时,返回值是1,这与逻辑不符合,所以这个时候变量wtf要加上双引号"$wtf"。
对于文件加不加引号结构都是一样的,如:
[root@ceshiji ~]# cd /tmp
[root@ceshiji tmp]# ls
tmp0F7ZGn tmpcywyqY tmpEAwY35 tmpinHrdN tmpwk_xzo yum.log
[root@ceshiji tmp]# [ -e /tmp/wutengfei ] && echo 1 || echo 0
[root@ceshiji tmp]# [ -e "/tmp/wutengfei" ] && echo 1 || echo 0
0