||後の Union コマンド(または)演算子

||後の Union コマンド(または)演算子

以下のコードを書くときは、ステートメントの後に複数のコマンドを実行できますelse

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

ただし、他の構文を使用する場合は、次のことはできません。または:

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

私のユースケースには、に基づく複雑なスクリプトがあるので、"$?" == 0メッセージが間違っている場合(メッセージをエコーすることに加えて)、中断する方法を探しています。

ベストアンサー1

このペアは( )サブシェルを生成し、内部シャットダウンコマンドを使用してスクリプト全体をシャットダウンする目標を破棄します。

自動区切り記号の代わりにコマンドに似ているので、次のよう( )に置き換えます。末尾のスペースと内部の最後のコマンドは、いくつかの終端文字で終わらなければなりません。これにより、同じシェルチェーンでコマンドが実行されるため、シャットダウンされ、このシェルに影響します。{ }{ }{;

[ "$?" -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.

ダッシュマンページバッシュマンページ、...

おすすめ記事