`printf` を使って `%` パーセント記号を含む変数を印刷すると、「bash: printf: `p': 無効な書式文字」が発生します。

`printf` を使って `%` パーセント記号を含む変数を印刷すると、「bash: printf: `p': 無効な書式文字」が発生します。

printf変数の印刷に使用したいです。変数には%パーセント記号を含めることができます。

最小限の例:

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

echo希望の出力を提供します。)

答え1

printf一般的な形式で使用:

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

からman printf

SYNOPSIS
printf FORMAT [ARGUMENT]...

あなたはする必要がありますいいえエラーとセキュリティホールが発生する可能性があるため、変数をFORMAT文字列に渡してください。


ところで:

%形式の一部として記号を使用するには、記号を入力する必要があります%%。たとえば、次のようになります。

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

答え2

与えられたフォーマット文字列に変数の内容を入れないでくださいprintf。代わりにこれを使用してください:

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

答え3

printf保証されたパラメータを許可し、渡された内容に応じてさまざまな追加パラメータを許可します。だからこんな感じ:

printf '%07.2f' 5

になる:

0005.00

最初のパラメータは " format"と呼ばれ、常に存在します。文字列が含まれていない場合は、%単に印刷されます。したがって:

printf Hello

簡単に作成してください(デフォルトモードでは末尾の改行が追加されないことに注意する価値がありますHello)。echo例はうまくいくと予想しましたが、sなしで文字列だけを渡したため、以前は(無意識のうちに)それを乱用していたという事実によってすでに誤解されています%。交換する必要がないため、機能は同じです。formatprintfecho -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"

関連情報