2017-07-02 157 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