24

bashテスト内で複数のステートメントを実行する方法を知っている人はいますか?したがって、私が使用する場合:

[[ $Var = 1 ]] && echo "yes-1" || echo "no-1"

そして、設定Var=1して出力は次のようになります。yes-1
設定した場合Var=2、出力は次のようになります。no-1

そして、これは私が期待したように機能します。しかし、ミックスで実行する別のステートメントを追加しようとしても機能しない場合:

[[ $Var = 1 ]] && echo "yes-1";echo "yes-2" || echo "no-1";echo "no-2"

これは、bashがコマンドが;で終わるのを見るので意味があります。しかし...これは私が望むものではありません。

グループ化と評価と関数を試し、失敗と成功を経験しましたが、本当にやりたいのは、この作業を1行で行うことです。誰かアイデアはありますか?

4

3 に答える 3

43

単純なコマンドのグループ化が機能するはずです。ただし、構文は少し注意が必要です。

[[ $Var = 1 ]] && { echo "yes-1"; echo "yes-2"; } || { echo "no-1"; echo "no-2"; }

注意すべきいくつかのこと:

  1. if-then-elseもっと複雑なことをする場合は、ステートメントの使用に関する@tvmのアドバイスに注意してください。

  2. 中括弧内のすべてのコマンドは、最後のコマンドも含めてセミコロンで終了する必要があります。

  3. 各中括弧は、両側のスペースで周囲のテキストから区切る必要があります。中かっこは単語の区切りを引き起こさないbashため、「{echo」は単一の単語であり、「{echo」は中かっこであり、その後に「echo」という単語が続きます。

于 2012-06-14T19:16:04.373 に答える
12

通常のIFTHENELSEステートメントの使用を検討してください。&&と||の使用 次のような簡単なテストで正当化されます。

[[ -z "$PATH" ]] && echo 'Disaster, PATH is empty!' || echo 'Everything ok!'

ただし、次のコマンドを検討してください。

true && true && true && false && true || echo 'False!'
False!

また

true && { echo true; false ; } || { echo false; true ; }
true
false

ゼロ以外の終了ステータスが返されるときはいつでも、||の後にコマンドを実行してください。実行されます。ご覧のとおり、コマンドのグループ化でさえ役に立ちません。

サブシェルでの実行も同様に動作します。

true && ( true; echo true; true; false ) || ( true; echo true; false )
true
true

適切なIF動作が必要な場合は、通常のIFを使用してください。

于 2012-06-14T18:49:14.420 に答える
2

サブシェルを使用する:

$ Var=1; [[ $Var = 1 ]] && ( echo "yes-1";echo "yes-2" ) || ( echo "no-1";echo "no-2"; )
yes-1
yes-2

$ Var=2; [[ $Var = 1 ]] && ( echo "yes-1";echo "yes-2" ) || ( echo "no-1";echo "no-2"; )
no-1
no-2
于 2012-06-14T18:25:12.067 に答える