web-dev-qa-db-ja.com

`printf`を使用して`% `パーセント記号を含む変数を出力すると、「bash:printf:` p ':無効なフォーマット文字」になります

printfを使用して変数を出力したい。この変数に%パーセント記号が含まれている可能性があります。

最小限の例:

$ TEST="contains % percent"
$ echo "${TEST}"
contains % percent
$ printf "${TEST}\n"
bash: printf: `p': invalid format character
contains $

echoは必要な出力を提供します。)

6
finefoot

printfを通常の形式で使用します。

printf '%s\n' "${TEST}"

man printfから:

SYNOPSIS
printf FORMAT [ARGUMENT]...

never変数をFORMAT文字列に渡してください。エラーやセキュリティの脆弱性につながる可能性があります。


ところで:

fORMATの一部として%記号を使用する場合は、%%を入力する必要があります。例:

$ printf '%d%%\n' 100
100%
16
pLumo

printfに指定されたフォーマット文字列に変数コンテンツを含めないでください。代わりにこれを使用してください:

printf '%s\n' "${TEST}"
10
Stephen Kitt

printfは1つの保証されたパラメーターを受け取り、渡したものに基づいていくつかの追加パラメーターを受け取ります。だからこのようなもの:

_printf '%07.2f' 5
_

に変わります:

_0005.00
_

format」と呼ばれる最初のパラメーターは常に存在します。 _%_ stringsが含まれていない場合は、単に出力されます。したがって:

_printf Hello
_

単にHelloを生成します(特に、末尾の改行なしではechoはデフォルトモードで追加されます)。あなたの例が機能することを期待して、あなたはこの事実のあなた自身の(知らない)虐待に惑わされました。 _%_ sなしの文字列のみをformatprintfに渡したため、置換を必要としないものを出力するように要求し続けたため、_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"
_
3
BMDan