展开转义字符串的方法有很多种,但是如何让 shell 命令将字符串作为参数并对其进行转义呢?
以下是一些不同扩展方式的示例:
$ echo -e '\x27\\012\b34\n56\\\aa7\t8\r 9\0\0134\047'
'\0134
9\'7 8
$ echo $'\x27\\012\b34\n56\\\aa7\t8\r 9\0\0134\047'
'\0134
9\a7 8
$ PS1='(5)$ ' # At least tab-width - 3 long; 5 columns given typical tab-width.
(5)$ printf %b '\x27\\012\b34\n56\\\aa7\t8\r 9\0\0134\047'
'\0134
9\'(5)$
注意:上面的 7 和 8 之间实际上有一个制表符,但标记呈现似乎破坏了它。
是的,里面有各种各样的疯狂。 ;-)
无论如何,我正在寻找这种转义扩展命令的反面。如果命令被称为 escape
,它将满足以下属性:
$ echo -ne "$(escape "$originalString")"
应该像“echo -n "$originalString"
”一样输出 originalString
的逐字值。 IE。它应该是一个身份。
同样:
$ escape "$(echo -ne "$escapedString")"
应该再次输出转义的字符串,但不一定与之前的方式相同。例如。 \0134
可能会变成 \\
,反之亦然。
最佳答案
不要使用 echo -e
-- 它在 POSIX 中的规定很差,除了最简单的用途外,它被认为已弃用。 Bash 对其 printf
进行了扩展,提供了更好的支持方法:
printf -v escaped_string %q "$raw_string"
...为您提供一个原始字符串的 shell 转义字符串(将其存储在名为 escaped_string
的变量中),以及
printf -v raw_string %b "$escaped_string"
...从反斜杠转义的字符串中为您提供原始字符串,并将其存储在 raw_string
中。
请注意,这两种转义语法并不等同——使用 printf %q
转义的字符串可用于 eval
,而不是用于 printf %b
.
也就是说,您可以安全地运行:
eval "myvar=$escaped_string"
...当 escaped_string
已使用 printf %q
如上所述创建时。
也就是说:用例是什么?强烈建议将原始字符串作为原始字符串处理(在需要定界时使用 NUL 终止符),而不是将它们与转义形式相互转换。
关于string - 一个 ‘contract’ 字符串如何转义 Bash 中的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24023327/