2017-07-02 198 views
0

我有一个if声明如下。为什么IF条件被忽略 - Shell

if [ $? -eq 0 ] 
echo "err A is $?" 
then 
alrtid="OK" 
echo "DO THIS" 
else 
echo "Do THAT" 
alrtid="NOK" 

但是,当我执行此返回:

'[' 1 -eq 0 ']' 
echo 'err A is 1' 
err A is 1 
alrtid=OK 

按照声明,它应该返回警报 'NOK'。为什么会发生这种行为?

+0

'then'在'echo'之后(或者在新行的下面),'if'后面,''echo' – bistoco

+0

@bistoco语法是合法的,即使它没有提供你期望的结果* 。 – chepner

+0

@chepner:你说这是合法的;你能解释一下吗,为什么?我查阅了* dash *手册(AFIK实现了POSIX标准),并明确指出'then'必须遵循'if'。它没有说明如果两者之间存在语句会发生什么,所以我认为它在语法上是非法的,但shell决定不输出错误消息,而是简单地展示未定义的行为。 – user1934428

回答

1

您的echo是条件的最后一个命令,是if测试以确定要采用哪个分支。试试这个:

if rv=$?; echo "err A is $rv"; [ "$rv" -eq 0 ]; then 

注意,在你原来的$?echo命令的值是紧接它,而不是值[测试[的结果。

+0

你是最好的Chepner 。 – Sunny1985

+1

请注意,在风格上,大多数人只会写'rv = $?;回声“错误A是$ rv”;如果...'。 –

+0

是的,我不确定我是否曾经在“if”条件下尝试过这样的事情。 (循环条件,是的,但不是'如果'。) – chepner