【问题标题】:How to "unescape" the output of bash's `printf "%q"`如何“取消转义”bash的`printf“%q”`的输出
【发布时间】:2017-08-01 08:39:24
【问题描述】:

在 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'

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

现在,如果我想将原始的未转义字符串回显到标准输出怎么办?如果我只是做一个简单的echo,它包括所有的元/控制字符; echo -e 让我更进一步,但不是完全未转义的状态。

【问题讨论】:

  • bash 可以取消转义:bash -c "echo ${var}"
  • 整洁:谢谢@hek2mgl。如果您将此添加为答案,我会接受:)
  • 嗯。这只是一个想法。我对此并不满意。重新介绍了使用printf $q时避免的那些风险
  • 是的,它很容易受到代码注入的影响......耻辱:P
  • ...也许不是:printf -v X "%q" '$(touch foo)'; Y="$(bash -c "echo $X")"; echo "$Y"$Y 设置为并回显$(touch foo),但不会执行touch foo

标签: bash escaping printf


【解决方案1】:

使用printfeval 来“取消转义”字符串(这是非常安全的,因为它已经被bash 引用了)。 echo 通常对任意用户输入很危险。

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

printf 的参数是%s\\n,即使在单引号内也有双反斜杠,因为 eval 会将它作为一个参数,然后按原样剥离(评估它),所以它实际上变成了这样的东西:printf %s\\n $'12\n34 56'是一个完全安全且有效的命令(变量甚至包括换行符和空格,如您所见)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 2014-11-22
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多