標準出力で印刷するエコーに似た方法である「printf」を使用したくないのはなぜですか? [コピー]

標準出力で印刷するエコーに似た方法である「printf」を使用したくないのはなぜですか? [コピー]

printfどのように動作するかを調べようとしたときに、次のスクリプトを作成しました。

#!/usr/bin/bash

printf "Give me your three preferences.?
"
read p1
read p2
read p3
printf "%s\n" "${p1}" "${p2}" "${p3}"
printf "Just the same as this, \n"
printf "%s\n%s\n%s\n" "${p1}" "${p2}" "${p3}"
printf "I've found this way to be the easiest, ${p1}\n ${p2}\n ${p3}\n"

試行錯誤を通して、私は3番目のアプローチがうまくいくことを知りました。この学習リソースは指定されていません。。 -printfと似ているので、最も頻繁に使用しますecho。これらの値の印刷方法が機能しないstdoutさまざまな状況や値がありますか?なぜこの使用法を避けたいのですかprintf

答え1

なぜこのようなprintfの使用方法を避けたいですか?

FelixJNが述べたように、最後のprintf形式にはユーザー提供のデータのみが含まれています。スクリプトを試して、「私の最初の選択は%sです」のように入力してください。最後の場合は印刷されませんが、%s代わりに引数の書式指定子が欠落していると解釈します(したがって%s何も置き換えられます)。

$ p1="%s"
$ printf "I've found this way to be the easiest, ${p1}\n"
I've found this way to be the easiest, 

Cなどの他の言語では、型が正しくない文字列を処理する方法はBashほど寛大ではないため、これはセキュリティホールと見なすことができます。 「形式文字列の脆弱性」または「制御されない書式文字列」。

答え2

printfコマンドは次のように書かれています。

printf format [argument]...

つまり、最後のオプションは形式を​​形式的にのみ印刷し、形式のパラメータを適用しないことです。これはいいですね。利点は、printfパラメータをゼロで埋めたり、最大文字列長を定義するなど、特別にフォーマットできることです。

これは必要ありませんが、正直なところ、echoこのユースケースには十分です。

関連情報