说我有这个命令:
printf $text | perl program.pl
我如何保证$ text变量中的所有内容都是字面上的?例如,如果$ text包含hello"\n
,我如何确保传递给program.pl的确切内容,而不会将换行符或引号(或任何可想到的字符)解释为特殊字符?
答案 0 :(得分:2)
行情!
printf '%s' "$text" | ...
如果您想要精确保留其内容,那么永远不会扩展变量。此外,如果您希望将动态字符串视为文字数据,请不要将其作为格式变量传递。
如果要解释反斜杠序列 - 例如,要将两个字符的序列\n
更改为单个换行符 - 并且shell是bash,请改用printf '%b' "$text"
。如果你想要逐字节的准确性,%s
是正确的东西(适用于任何符合POSIX的shell)。如果你想转义来解释另一个shell (如果你将内容作为ssh
命令行的一部分传递,那将是合适的),那么适当的格式字符串(用于bash)只有)是%q
。