[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,输出SUCCESS
或FAIL
。