如何正确使用testing命令?

[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语句失败?

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

UPDATE

有人可以说明如何模拟复杂的expression式,如1=1 and (0=1 or 1=1)[[

返回代码不打印; 你必须回应$?的价值$? 为了看到它。

[是一个命令。 正如你不写echoHelloworld ,你不能写[1 ...

有几个等效的方法来做你正在寻找的测试。 首先,基本上是你这样做的方式,但固定的语法(在[ (又名test )命令的参数周围添加必要的空格,以及在;和之间):

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

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

 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的[[ operator]代替[ command; 请注意[[不是命令,因此它的表达式不被解析为命令参数,允许它更直观的语法(例如允许&&||作为运算符,括号和!<>比较而不转义):

 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支持[[ ,处理比[更容易处理[

正如@ IgnacioVazquez-Abrams正确指出的, test只是设置错误代码。

也就是说,这里有一个很好的bash-ism来快速检查错误值:

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

由于&&|| 短路,根据测试返回0还是非0,输出SUCCESSFAIL