&&および||の後のbash行の継続はどこですか 文書化?


28

このコンストラクトをスクリプトでよく見て、自分で使用しましたが、ドキュメンテーションで見つけることができないように思われます。

例:

[ -f file1 ] &&
[ -f file2 ] &&
echo "Both files exist." ||
echo "One or the other file doesn't exist."

これは、次のように、改行の前にバックスラッシュを使用して行うこともできますman bash

If a \<newline> pair appears,  and  the  backslash  is  not
itself  quoted,  the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).

例:

[ -f file1 ] && \
[ -f file2 ] && \
echo "Both files exist." || \
echo "One or the other file doesn't exist."

...しかし、これは必要ではないようです。上記の最初のバージョンは、バックスラッシュなしでも機能します。

これはどこにありますman bashか?(また、これはbash特定の、またはPOSIXに準拠していますか?)


公式のbashまたはPOSIXドキュメントを探している場合は、Gillesの回答を参照してください。しかし、これはシェルの制御およびリダイレクト演算子とは何ですか?- の詳細な観察;&()
G-Manは「Reinstate Monica」と言います

@ G-Man、それは私に向けられたものではなかったと思う?将来の読者のために?質問で言ったように、「ドキュメンテーションでそれを見つけることができないように思われます。」 私はすでにそれがどのように機能するかを知っていたので、これは確かに公式文書のリクエストに過ぎませんでした。:)
ワイルドカード

配列の場合でも、暗黙的な行の継続がありますnames=( Rama Soma<newline> Sita Diya )。Pythonはこれらをここで明確に説明していますが、Bashのドキュメントはそうではないようです。
ジャマダーニ

回答:


39

終了しないコマンドが明らかに存在するいくつかのコンテキストでは、改行は無視されます。これらの状況は、制御演算子の後には、( 、&&|||&;;;ではありません!)。

これはbashのマニュアルには記載されていません。

POSIXでは、文法規則によって指定されます。ルールのあるところはどこでも、linebreak0個以上の改行を含めることができます。


+1、単純なパイプ(|)で機能することを知りませんでした。読みやすくするために次の行にも配置できるといいのですが、それではうまくいきません(そうする場合は、前の改行をエスケープする必要があります)。
オリビエデュラック

1
@OlivierDulacそれはどのように機能するのでしょうか?現在のコマンドラインを処理しているとき|、次の行の先頭に入力することを計画していることをどのようにして知るのでしょうか。シェルはスクリプトだけでなくインタラクティブにも使用され、文法も同じであることを忘れないでください。
バーマー

@バーマー:私は知っている、私はこれを知っている(学校でコンパイラを書いた^^)...私は「私は希望」と言った、それは非常にもっともらしい願いではない
オリヴィエデュラック

1
@DocSalvager、防止に役立つ論理バグの例を教えていただけますか?私はそれを見るのに苦労しています
....-ワイルドカード

2
@DocSalvager、私は実際に書いたコードを使用しませんでした。ただし、最後の行(else節)がなければ、そのように使用します。(「これとこれならそうする」の場合this && this2 && thatは問題ありませんが、else句の場合は実際に使用しif then else fiます。)
ワイルドカード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.