如何正确使用测试命令?

时间:2010-05-29 04:21:22

标签: linux bash

[root@jiaoyou ~]# test 1 = 1 -a 0 = 1
[root@jiaoyou ~]# if [1 = 1 -a 0 = 1]then echo 1;else echo 2;fi
-bash: syntax error near unexpected token `else'

为什么test没有提供任何输出且if语句失败?

有人能指出这里有什么问题吗?

更新

有人可以说明如何使用1=1 and (0=1 or 1=1)模拟[[等复杂表达式吗?

3 个答案:

答案 0 :(得分:4)

不打印退货代码;您必须回显$?的值才能看到它。

[是一个命令。就像你不写echoHelloworld一样,你不能写[1 ...

答案 1 :(得分:1)

有几种等效方法可以进行您正在寻找的测试。首先,基本上就是你的方式,但语法是固定的(在[(aka test)命令的参数周围添加了所需的空格,;之间的] 1}}和then):

if [ 1 = 1 -a 0 = 1 ];then echo 1;else echo 2;fi

这是一个在表达式中具有显式分组的版本;请注意,括号必须被转义,因为它们是shell中的特殊字符,但在这种情况下,我们希望它们作为参数传递给[命令:

if [ \( 1 = 1 \) -a \( 0 = 1 \) ];then echo 1;else echo 2;fi

另一个带有显式分组的版本,这次使用两个独立的[命令连接bash的&&运算符(请注意,这也可以连接其他命令):

if [ 1 = 1 ] && [ 0 = 1 ];then echo 1;else echo 2;fi

最后,使用bash的[[运算符代替[命令的几个示例;请注意[[不是命令,因此其表达式不会被解析为命令参数,从而允许它更直观的语法(例如,允许&&||作为运算符,括号和!<>比较而不逃避):

if [[ 1 = 1 && 0 = 1 ]];then echo 1;else echo 2;fi
if [[ ( 1 = 1 ) && ( 0 = 1 ) ]];then echo 1;else echo 2;fi

更多注释/警告:所有这些示例中使用的=运算符都进行字符串比较而不是数字比较(即[ 1 = 01 ]为false);如果您想要进行数字比较,请使用-eq代替(类似地,<>是字符串比较,而-lt-gt是数字)。另外,如果你要比较包含空格的字符串,'['可能会在某些情况下将字符串误认为表达式的一部分(特别是如果你没有用双引号括起来的字符串);据我所知[[从来没有这个问题。总的来说,如果你使用支持[[的shell,那么处理它比[要容易得多。

答案 2 :(得分:0)

正如@ IgnacioVazquez-Abrams正确陈述,test只是设置错误代码。

那就是说,这是一个很好的bash-ism,用于快速检查错误值:

test [ expr ] && echo SUCCESS || echo FAIL

由于&&||的短路,输出SUCCESSFAIL取决于测试是返回0还是非0。