||の場合は2つのコマンドを実行します または&&


10

&&と||について読みました そして、私は誤ったケースで2つのコマンドを実行したいと思います。

私は試しました;が、それは常に実行されています。中かっこに入れてみ{ command1; command2 }ましたが、構文エラーになります。

私は何かしたいです

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

これは、インターネット接続がない場合にのみ終了します。


1
これは単純な誤植のようです。より多くの興味深い質問は質問する方法は間違いである(){}
edwinksl

回答:


26

括弧を使用すると、コマンドがサブシェルに配置されますが、常に必要なわけではありません。または、中括弧を使用します。

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }

ここでの秘訣は、括弧とは異なり、中括弧で囲まれた最後のコマンドの後にが続く必要があること;です。

セミコロンまたは改行が必要な理由

中括弧は、コマンドの有効な引数です。たとえば、次の引数として中かっこがありますecho

$ echo }
}

その結果、シェルが次のように見える場合:

{ command1; command2 }

シェルはcommand1を引数なしと解釈し、command2は文字からなる1つの引数を持つと解釈し}ます。中括弧}は、セミコロンまたは改行に続く場合のみ、グループを閉じると解釈されます。上記を機能させるには:

{ command1; command2; }

サブシェルとの間の差{...}(...)

以下はx10に設定されていますが、echoコマンドが実行される前にその設定が忘れられていることに注意してください。

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

対照的に、中括弧では、の設定x=10が記憶されます。

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

違いは、サブシェルでの変数の割り当ては、サブシェルが完了した後は存続しないためです。

ドキュメンテーション

からman bash

(リスト)

listはサブシェル環境で実行されます(以下のコマンド実行環境を参照)。シェルの環境に影響を与える変数の割り当てと組み込みコマンドは、コマンドの完了後も有効になりません。返却ステータスはリストの終了ステータスです。

{リスト; }

listは、現在のシェル環境で単純に実行されます。 リストは改行またはセミコロンで終了する必要があります。 これはグループコマンドと呼ばれます。返却ステータスはリストの終了ステータスです。メタ文字(および)とは異なり、{および}は予約語であり、予約語の認識が許可されている場所に出現する必要があることに注意してください。これらは単語の区切りを引き起こさないため、空白または別のシェルメタ文字によってリストから分離する必要があります。

【エンファシス追加】

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.