printf
を使用して変数を出力したい。この変数に%
パーセント記号が含まれている可能性があります。
最小限の例:
$ TEST="contains % percent"
$ echo "${TEST}"
contains % percent
$ printf "${TEST}\n"
bash: printf: `p': invalid format character
contains $
(echo
は必要な出力を提供します。)
printf
を通常の形式で使用します。
printf '%s\n' "${TEST}"
man printf
から:
SYNOPSIS printf FORMAT [ARGUMENT]...
never変数をFORMAT文字列に渡してください。エラーやセキュリティの脆弱性につながる可能性があります。
ところで:
fORMATの一部として%
記号を使用する場合は、%%
を入力する必要があります。例:
$ printf '%d%%\n' 100
100%
printf
に指定されたフォーマット文字列に変数コンテンツを含めないでください。代わりにこれを使用してください:
printf '%s\n' "${TEST}"
printf
は1つの保証されたパラメーターを受け取り、渡したものに基づいていくつかの追加パラメーターを受け取ります。だからこのようなもの:
_printf '%07.2f' 5
_
に変わります:
_0005.00
_
「format
」と呼ばれる最初のパラメーターは常に存在します。 _%
_ stringsが含まれていない場合は、単に出力されます。したがって:
_printf Hello
_
単にHello
を生成します(特に、末尾の改行なしではecho
はデフォルトモードで追加されます)。あなたの例が機能することを期待して、あなたはこの事実のあなた自身の(知らない)虐待に惑わされました。 _%
_ sなしの文字列のみをformat
にprintf
に渡したため、置換を必要としないものを出力するように要求し続けたため、_echo -ne
_。
これを実行したい場合右は、printf
の組み込み置換機能を使用して印刷可能な文字列を作成し始めるとよいでしょう。このような行がコード全体に表示されます。
_printf '%20s: %6d %05d.%02d%%' "$key" $val $((val/max)) $((val*100/max%100))
_
現在実行していることを正確に実行したい場合は、次のように_echo -ne
_が必要です。
_TEST="contains % percent"
echo -ne "${TEST}\n"
_
これは、変数内の_\
_エスケープを解釈する(問題のある)動作を保持します。 _-n
_を指定して_\n
_に戻すのも少しばかげているように見えますが、これは現在行っているすべてに適用できるグローバルな検索と置換であるため提供します。変数で動作する_\
_エスケープを引き続き保持するよりクリーンなバージョンは、次のようになります。
_TEST="contains % percent"
echo -e "$TEST"
_