Linux

|| 之後的聯合命令(OR) 運算符

  • December 30, 2018

當我按照下面的方式編寫程式碼時,我可以在else語句之後執行幾個命令:

if [ "$?" -eq 0 ]
   then              
       echo "OK"
   else 
       echo "NOK"
       exit 1
fi

但是,當我使用另一種語法時,我無法在OR之後合併 2 個命令:

[ "$?" -eq 0 ] && echo "OK" || (echo "NOK" >&2 ; exit 1)

在我的案例中,我有一個基於 的複雜腳本"$?" == 0,因此我正在尋找一種方法在它不正確時中止(除了回顯消息)。

這對( )產生了一個子shell,破壞了使用exit命令退出整個腳本的目標。

只需替換( )with { } (和調整後的語法,因為{ }不是自動分隔符,而是更像命令:{內部的最後一個命令後面的空格必須以某個終止符結尾:;適合):這將在同一個 shell 中執行命令鏈,從而退出會影響這個shell。

[ "$?" -eq 0 ] && echo "OK" || { echo "NOK" >&2; exit 1;}

更新:@D.BenKnoble 評論說應該echo失敗,行為不會像以前的if ...; then ... else ... fi構造。所以第一個echo的退出程式碼必須用 noop:命令“轉義”(內置不能失敗)。

[ "$?" -eq 0 ] && { echo "OK"; :;} || { echo "NOK" >&2; exit 1;}

參考:

POSIX

分組命令

命令分組的格式如下:

(compound-list)
     Execute compound-list in a subshell environment; see Shell
     Execution Environment. Variable assignments and built-in commands 
     that affect the environment shall not remain in effect
     after the list finishes.

$$ … $$

{ compound-list;}
     Execute compound-list in the current process environment. The
     semicolon shown here is an example of a control operator delimiting
     the } reserved word. Other delimiters are possible, as shown
     in Shell Grammar; a <newline> is frequently used.

破折號手冊頁bash 手冊頁,…

引用自:https://unix.stackexchange.com/questions/490572