如何" unescape" bash的输出'printf"%q"`

时间:2017-08-01 08:39:25

标签: bash escaping printf

在bash中,您可以使用printf "%q"来转义字符串中的特殊字符。为了清楚起见,我在以下示例中添加了换行符:

$ printf "%q\n" "foo"
foo
$ printf "%q\n" 'foo$bar'
foo\$bar
$ printf "%q\n" "foo    bar"  # Tab entered with Ctrl+V Tab
$'foo\tbar'

您可以向-v提供printf选项,将输出粘贴到变量中,而不是回显到stdout。

现在如果我想将原始的,未转义的字符串回显给stdout怎么办?如果我只做一个简单的echo,它包含所有元/控制字符; echo -e让我稍微进一步,但不是完全没有转变的状态。

1 个答案:

答案 0 :(得分:0)

使用printfeval来" unescape"字符串(它非常安全,因为它已经被bash引用)。通常,echo对任意用户输入都是危险的。

eval printf '%s\\n' "$var"

printf的参数是%s\\n,即使在单引号内也有双反斜杠,因为eval会将其作为一个参数然后将其剥离(评估它),因此它实际上变为类似:{{ 1}}这是一个非常安全有效的命令(变量甚至包括换行符和空格,如你所见)。