条件判断的语法

同绝大多数语言一样,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——逻辑或

把它放在两个逻辑表达式中间,只要两个表达式有一个为真,结果就为真。

Last modification:September 7th, 2019 at 09:06 pm