finefoot Asked: 2019-05-17 07:31:04 +0800 CST2019-05-17 07:31:04 +0800 CST 2019-05-17 07:31:04 +0800 CST 使用 `printf` 打印包含 `%` 百分号的变量会导致“bash: printf: `p': invalid format character” 772 我想用来printf打印一个变量。此变量可能包含%百分号。 最小的例子: $ TEST="contains % percent" $ echo "${TEST}" contains % percent $ printf "${TEST}\n" bash: printf: `p': invalid format character contains $ (echo提供所需的输出。) bash variable 3 个回答 Voted Best Answer pLumo 2019-05-17T07:32:10+08:002019-05-17T07:32:10+08:00 printf以正常形式使用: printf '%s\n' "${TEST}" 来自man printf: SYNOPSIS printf FORMAT [ARGUMENT]... 切勿将变量传递给 FORMAT 字符串,因为它可能会导致错误和安全漏洞。 顺便提一句: 如果您想将%符号作为 FORMAT 的一部分,则需要输入%%,例如: $ printf '%d%%\n' 100 100% Stephen Kitt 2019-05-17T07:32:34+08:002019-05-17T07:32:34+08:00 您永远不应该将变量内容放在给定的格式字符串中printf。改用这个: printf '%s\n' "${TEST}" BMDan 2019-05-17T12:39:14+08:002019-05-17T12:39:14+08:00 printf接受一个保证参数,然后根据您传递的内容获取一些附加参数。所以是这样的: printf '%07.2f' 5 变成: 0005.00 第一个参数,称为“ format”,始终存在。如果它不包含%字符串,则简单地打印它。因此: 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"
printf
以正常形式使用:来自
man printf
:切勿将变量传递给 FORMAT 字符串,因为它可能会导致错误和安全漏洞。
顺便提一句:
如果您想将
%
符号作为 FORMAT 的一部分,则需要输入%%
,例如:您永远不应该将变量内容放在给定的格式字符串中
printf
。改用这个:printf
接受一个保证参数,然后根据您传递的内容获取一些附加参数。所以是这样的:变成:
第一个参数,称为“
format
”,始终存在。如果它不包含%
字符串,则简单地打印它。因此:生成简单
Hello
(值得注意的是,没有尾随换行符echo
将添加其默认模式)。在期望你的榜样奏效时,你被自己之前(不知道的)滥用这一事实所误导;%
因为您只将不带s 的字符串传递给format
,所以从printf
的角度来看,您一直要求它输出不需要替换的东西,所以它的功能非常类似于echo -ne
.如果您想正确执行此操作,您可能希望开始使用
printf
的内置替换功能来形成可打印字符串。像这样的行出现在我的代码中:如果您想确切地希望您现在正在做的工作,您想要
echo -ne
,如下所示:这保留了在变量内部解释
\
转义的(有问题的)行为。-n
提供然后坚持下去似乎也有点愚蠢\n
,但我提供它是因为它是一个全球性的查找和替换,您可以将其应用于您当前正在做的所有事情。一个仍然保持\
逃逸在变量中工作的更简洁的版本是: