条件判断的语法
同绝大多数语言一样,Shell有关条件判断的关键字同样是 if ,不过语法和C语言等稍有不同:
if case1
then
command1
elif case2
then
command2
else
command3
fi
其中,if、then、elif、else和fi都是关键字。
测试条件的4种形式
在条件判断语句中,if 后面跟的就是要判断的测试条件,Shell中测试条件的写法同样和C语言等有很多差别。具体来说Shell中测试条件有四种常用形式。
第一种是用 test 命令,即将要测试的语句跟在 test 命令后面:
-eq 表示判断是否相等。用test命令作为测试条件的时候不能使用诸如 ==、<、> 等操作符。只能使用Shell提供的很多系统操作符(例如这里用到的 -eq 可以代替 ==),这一部分将在下一节介绍。
第二种是用一对中括号[ ]
将测试条件括起来。这种形式和第一种形式完全等价,例如上面的例子可以改写成:
其中需要注意的地方是方括号内部的左右两端要各有一个空格,否则会报错。而且完全一样就说明同样也不能使用 == 等操作符。
第三种是用如下形式:[[ 条件表达式 ]]
。这种形式比前两种更加强大,因为其中的条件表达式不仅兼容之前那些简单的条件判断,而且还支持Shell通配符甚至是正则表达式,而且可以用 && || 来连接多个条件表达式,而且可以使用上面两种形式中所不能使用的 == 等操作符。下面是一些例子:
第四种是使用算数运算中的 (( )),算术运算的具体内容可以看这篇博客:
其中告诉了我们就像C语言一样,算数运算也可以返回值,例如 ((1<20))
就会返回1,所以同样也可以将算术表达式应用在判断条件的位置,而且这里不用加上[]
。
Shell系统运算符
shell提供了很多实用的系统运算符来丰富测试条件,例如可以判断一个文件是普通文件还是目录文件。下面是4种常用的系统运算符:
文件测试运算符
参数 | 功能 |
---|---|
-r | 若文件存在且是用户可读的,则测试条件为真 |
-w | 若文件存在且是用户可写的,则测试条件为真 |
-x | 若文件存在且是用户可执行的,则测试条件为真 |
-f | 若文件存在且是普通文件,则测试条件为真 |
-d | 若文件存在且是目录文件,则测试条件为真 |
-p | 若文件存在且是FIFO文件,则测试条件为真 |
-b | 若文件存在且是块设备文件,则测试条件为真 |
-c | 若文件存在且是字符设备文件,则测试条件为真 |
-s | 若文件存在且文件的长度大于0,则测试条件为真 |
字符串测试运算符
参数 | 功能 |
---|---|
-z s1 | 如果字符串s1长度为0,则测试条件为真 |
-n s1 | 如果字符串s1长度大于0,则测试条件为真 |
s1 | 如果字符串s1不是空字符串,则测试条件为真 |
s1=s2 | 如果s1等于s2,则测试条件为真。= 可用 == 替换 |
s1!=s2 | 如果s2不等于s2,则测试条件为真 |
s1<s2 | 如果按字典序s1在s2之前,则测试条件为真 |
s1>s2 | 如果按字典序s1在s2之后,则测试条件为真 |
数值测试运算符
参数 | 功能 |
---|---|
n1 -eq n2 | 如果整数n1等于n2,则测试条件为真 |
n1 -ne n2 | 如果整数n1不等于n2,则测试条件为真 |
n1 -lt n2 | 如果整数n1小于n2,则测试条件为真 |
n1 -le n2 | 如果整数n1小于等于n2,则测试条件为真 |
n1 -gt n2 | 如果整数n1大于n2,则测试条件为真 |
n1 -ge n2 | 如果整数n1大于等于n2,则测试条件为真 |
逻辑运算符
上述测试条件可以在 if 语句或循环语句中单个使用,或通过逻辑运算符把它们组合起来使用。可以在测试语句中使用的逻辑运算符有:
!——逻辑非
放在任意逻辑表达式之前,表示真变假,假变真。
-a——逻辑与
把它放在两个逻辑表达式中间,仅当两个表达式都为真时,结果才为真。
-o——逻辑或
把它放在两个逻辑表达式中间,只要两个表达式有一个为真,结果就为真。