2012-06-14 14 views
11

bashテストで複数のステートメントを実行する方法を知っている人はいますか?だから私は使用している場合:私はVar=2を設定した場合、出力はyes-1
bashテストごとに複数のステートメントを実行する方法&&ステートメント

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

と出力、その後Var=1に設定されているno-1

そしてこの作品、私は予想通り。しかし、私は、ミックスの中で実行するための別のステートメントを追加しようと、それが動作しない場合:

bashはで終わるコマンドを見て理にかなっている
[[ $Var = 1 ]] && echo "yes-1";echo "yes-2" || echo "no-1";echo "no-2" 

。しかし...これは私が望むものではありません。

私はグルーピングとエバールと機能を試して失敗と成功を収めましたが、私はこの作業を1行にしたいと思っています。誰にでもアイデアはありますか?

答えて

19

単純なコマンドグループが有効です。構文はややこしいかもしれません。

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

注意すべきいくつかのこと:あなたがより複雑な何をすればif-then-elseステートメントを使用する方法について

  1. 留意してくださいする@ TVMのアドバイス。

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

  3. 各ブレースは、周囲のテキストから両側のスペースで区切らなければなりません。中かっこはbashで単語区切りを発生させないので、 "{echo"は単一の単語で、 "{echo"は中括弧で、その後に "echo"が続きます。

+0

私はこのようなことを試してみましたが、 ";" 2番目のステートメントの最後に。 –

+0

私はあなたに正しい答えを与えました。なぜなら、 ";"各ステートメントの終わりには、()サブシェルまたは{}グルーピングのいずれかで動作します。 –

+0

IMOでは、ほとんどの場合、コマンドグループ化が優れています。例えば何かが失敗したときにスクリプトを終了したいなら、 'foocmd || {エコーfooは失敗しました。出口1。 } 'それは診断と終了を表示します。グループ化のためにサブシェルを使用すると、ほとんどの場合意図された効果ではない、サブシェル自体が終了し、sciptでは終了しません。 – JVMATL

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 
+1

はい、これは機能し、私はそれのようなものを試して誓っています。私はあなたが ";" "no-2"エコーの後で動作させることができますが、それを傷つけず、 "()"を "{}"に変更すると ";"が必要な場合は明白になります。 –

+0

私はパスを下って行くためにあなたのカウントアップを打ちました。 ";"と "chepner"と述べたように、各ステートメントの終わりに()サブシェルまたは{}のグループ化が機能します! –

+0

@ pn1dudeが同意すると、私はいつも一貫性のためにサブシェルまたはグループ化のすべての私のコマンドの終わりに ';'を使用します( ''特殊なケースはルールを破るのに十分ではない '':P)。私はこの時間がなかった唯一の理由は、私は急いでいたので私はあなたのコードをコピー/貼り付け、単に忘れていたためです:P私は、幸運を助けてうれしいです – KurzedMetal

10

がTHEN ELSE IF文定期的な使用を検討してください。 & &および||このような簡単なテストで正当化される:

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

しかし、次のコマンドを考えてみます。ゼロ以外の終了ステータスが返され

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

OR

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

いつでも、コマンドを後に| |実行される。ご覧のとおり、コマンドのグループ化でさえも役に立ちません。サブシェルで

実行は、同じように動作します。行動場合は、適切な必要がある場合

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

ただ、通常のIFを使用しています。

+0

あなたは正しいかもしれませんが、グループ化が機能するように見えます。私は一般にif-else-fi構造を使用しますが、[[]] && ||速くて簡単な文章では、私は2つの関与を持ち、if-else-fiはすばやく汚い[<]] && ||複数のステートメントがあります。 –

関連する問題