使用 `printf` 打印包含 `%` 百分号的变量会导致 "bash: printf: `p': invalid format character"

fin*_*oot 19 bash echo escape-characters printf variable

我想用来printf打印一个变量。此变量可能包含%百分号。

最小的例子:

$ TEST="contains % percent"
$ echo "${TEST}"
contains % percent
$ printf "${TEST}\n"
bash: printf: `p': invalid format character
contains $
Run Code Online (Sandbox Code Playgroud)

echo提供所需的输出。)

pLu*_*umo 37

使用printf以正常形式:

printf '%s\n' "${TEST}"
Run Code Online (Sandbox Code Playgroud)

来自man printf

SYNOPSIS
printf FORMAT [ARGUMENT]...
Run Code Online (Sandbox Code Playgroud)

你应该永远不会传递给格式字符串变量,因为它可能会导致错误和安全漏洞。


顺便提一句:

如果您想将%签名作为 FORMAT 的一部分,则需要输入%%,例如:

$ printf '%d%%\n' 100
100%
Run Code Online (Sandbox Code Playgroud)

  • 你真的需要`"${TEST}"`,难道不能是`"$TEST"`吗? (2认同)
  • +1。但这不仅仅是“正常”,而且是必要的。向 printf 的第一个参数传递一个变量对黑客来说是圣诞节。永远不要这样做。这是安全软件 dev 101 的一部分。 (2认同)

Ste*_*itt 13

你永远不应该把变量内容放在给定的格式字符串中printf。改用这个:

printf '%s\n' "${TEST}"
Run Code Online (Sandbox Code Playgroud)