在shell脚本中,如何确保变量中的所有字符都按字面顺序传递?

时间:2014-07-07 18:46:56

标签: shell escaping

说我有这个命令:

printf $text | perl program.pl

我如何保证$ text变量中的所有内容都是字面上的?例如,如果$ text包含hello"\n,我如何确保传递给program.pl的确切内容,而不会将换行符或引号(或任何可想到的字符)解释为特殊字符?

1 个答案:

答案 0 :(得分:2)

行情!

printf '%s' "$text" | ...

如果您想要精确保留其内容,那么永远不会扩展变量。此外,如果您希望将动态字符串视为文字数据,请不要将其作为格式变量传递。

如果要解释反斜杠序列 - 例如,要将两个字符的序列\n更改为单个换行符 - 并且shell是bash,请改用printf '%b' "$text"。如果你想要逐字节的准确性,%s是正确的东西(适用于任何符合POSIX的shell)。如果你想转义来解释另一个shell (如果你将内容作为ssh命令行的一部分传递,那将是合适的),那么适当的格式字符串(用于bash)只有)是%q