string - 一个 ‘contract’ 字符串如何转义 Bash 中的特殊字符?

标签 string bash escaping

展开转义字符串的方法有很多种,但是如何让 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/

相关文章:

javascript - 无法将变量作为 onClick 函数中的参数传递

c++ - 有效地从文件的各个行中读取 token

ios - 如何在 Swift 3 中将字符串转换为数组

java - Java字符串对象中Hash32和Hash的区别

php - Bash 字符串删除特定字符

linux - 如何分离 bash 文件生成的每个命令的输出?

bash - 特拉维斯 CI : How do I escape my password for `travis encrypt` to work?

arrays - 在 Matlab 中反转一个逻辑位

Bash 使用 GNU parallel 发送多个 curl 请求

xml - Oracle 的 EXTRACT 函数是否打破了 XMLELEMENT 中的 NOENTITYESCAPING?