逃避回声中的特殊字符

时间:2013-08-20 12:01:50

标签: string unix text echo

http://www.grymoire.com/Unix/Quote.html 显示特殊字符列表。是否有echo的参数/选项,我可以将echo之后的所有内容视为字符串?

在python中,我可以使用"""..."""'''...'''

$ python
>>> text = '''#"`\|^!@#@%$#$^%$&%^*()?/\;:$#$@$?$$$!&&'''
>>> print text
#"`\|^!@#@%$#$^%$&%^*()?/\;:$#$@$?$$$!&&

我可以在unix的回音中使用'''而不是""",为什么会这样呢?

$ echo #"`\|^!@#@%$#$^%$&%^*()?/\;:$#$@$?$$$!&&

$ echo '''#"`\|^!@#@%$#$^%$&%^*()?/\;:$#$@$?$$$!&&'''
#"`\|^!@#@%$#$^%$&%^*()?/\;:$#$@$?$$$!&&

$ echo """'''#"`\|^!@#@%$#$^%$&%^*()?/\;:$#$@$?$$$!&&"""
bash: !@#@%$#$^%$: event not found

如果我有这样的字符串会怎么样?

#"`\|^!@#@%$#$^%'''$&%^*()?/\;:$#$"""@$?$$$!&&

我该如何回应这样的字符串? (以下命令不起作用)

echo '''#"`\|^!@#@%$#$^%'''$&%^*()?/\;:$#$"""@$?$$$!&&'''

3 个答案:

答案 0 :(得分:1)

使用printf

$ printf "%s\n" $'#"`\|^!@#@%$#$^%$&%^*()?/\;:$#$@$?$$$!&&'
#"`\|^!@#@%$#$^%$&%^*()?/\;:$#$@$?$$$!&&
$ printf "%s\n" $'#"`\|^!@#@%$#$^%\'\'\'$&%^*()?/\;:$#$"""@$?$$$!&&'
#"`\|^!@#@%$#$^%'''$&%^*()?/\;:$#$"""@$?$$$!&&

您可能会注意到单引号'需要转义。

为了将输出分配给变量:

$ foo=$(printf "%s\n" $'#"`\|^!@#@%$#$^%\'\'\'$&%^*()?/\;:$#$"""@$?$$$!&&')
$ echo $foo
#"`\|^!@#@%$#$^%'''$&%^*()?/\;:$#$"""@$?$$$!&&

答案 1 :(得分:0)

这是因为shell将所有扩展规则应用于字符串双引号"中。 $!是用于表示变量或事件的特殊Unix字符,因此您会收到该错误。

答案 2 :(得分:0)

我认为这是因为你的shell(bash),expands/interprets double quotes。 这不适用于单引号。 有关详细信息,请查看Bash - Shell Expansion

对于echo命令,有-e选项可以解释反斜杠转义 - 这可能会有所帮助。