[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)
模拟[[
等复杂表达式吗?
答案 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
由于&&
和||
的短路,输出SUCCESS
或FAIL
取决于测试是返回0还是非0。