シェルスクリプトで長いコマンドを分割する

シェルスクリプトで長いコマンドを分割する

私はUnixシェルスクリプトを書いてきましたが、正しいフォーマットの経験はありません。単一のコマンドを実行するために長い行を書く必要がある状況がたくさんあります。

問題は、長いシェルコマンドラインを複数行に分割しますが、単一のコマンドで実行する方法はありますか?

答え1

単一の単純なコマンドの長い行は、次のように改行文字をエスケープして分割できます。

rsync --archive --itemize-changes \
    "$source" \
    "$target"

バックスラッシュはその行の最後の文字でなければなりません。

POSIX規格の関連ビット:

2.2.1 エスケープ文字(バックスラッシュ)

引用符なしのAは、<backslash>a以外の後続の文字のリテラル値を保持する必要があります<newline>。が<newline>後に来ると、<backslash>シェルはそれを行の連続として解釈します。入力をトークンに<backslash>分割する前に削除する必要があります。<newline>エスケープ文字は<newline>入力から完全に削除され、スペースで置き換えられないため、トークン区切り文字として使用できません。

パイプやリストなどの単一の複合コマンド内には、エスケープする必要がない改行文字の自然な点があることがよくあります(およびはコマンド&&ターミネーターなので)。|||

[ -e "$pathname" ] &&
printf 'Removing %s\n' "$pathname" &&
rm -- "$pathname"
awk -f script.awk <infile |
grep -e "$pattern" |
cat header.txt - >result.txt

答え2

長い文字列を小さく、読みやすいコンポーネントに分割するか、末尾の「\」を使用して改行を示します。

「男乱交」から:

\<newline>ペアが発生してバックスラッシュ自体が引用符で囲まれていない場合は、行の連続として\<newline>処理されます(つまり、入力ストリームから削除され、事実上無視されます)。

関連情報