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
このユースケースには十分です。