web-dev-qa-db-ja.com

bash printfで一連のバックスラッシュをエスケープするにはどうすればよいですか?

次のスクリプトは予期しない出力を生成しました:

printf "escaped slash: \\ \n"
printf "2 escaped slashes: \\\\ \n"
printf "3 escaped slashes: \\\\\\ \n"
printf "4 escaped slashes: \\\\\\\\ \n"

Ubuntu 14でbashスクリプトとして実行します。

escaped slash: \
2 escaped slashes: \ 
3 escaped slashes: \\ 
4 escaped slashes: \\

エラー。何ですか?

12
Charney Kaye

printfFORMAT文字列が二重引用符で囲まれていると仮定すると、printfは、たとえば、 echo(どちらもシェル組み込みコマンドです)。

printfに期待することは、実際には単一引用符を使用して実現できます。

printf '1 escaped slash:   \\ \n'
printf '2 escaped slashes: \\\\ \n'
printf '3 escaped slashes: \\\\\\ \n'
printf '4 escaped slashes: \\\\\\\\ \n'

出力:

1 escaped slash:   \
2 escaped slashes: \\
3 escaped slashes: \\\
4 escaped slashes: \\\\
7
Eugeniu Rosca

printfはbashビルトインです。 help printfを見てください。

 printf [-v var] format [arguments] 
 FORMATの制御下でARGUMENTSをフォーマットして出力します。

形式と引数を渡す必要があります。したがって、引数の前に"%s\n"という形式を追加します。

printf "%s\n" "escaped slash: \\"
printf "%s\n" "2 escaped slashes: \\\\"
printf "%s\n" "3 escaped slashes: \\\\\\"
printf "%s\n" "4 escaped slashes: \\\\\\\\"

出力:

エスケープスラッシュ:\ 
 2エスケープスラッシュ:\\ 
 3エスケープスラッシュ:\\\ 
 4エスケープスラッシュ:\\\\ 
4
Cyrus