在Bash中是否有需要转义的字符的全面列表?能否仅使用sed
进行检查
特别是,我正在检查是否需要对%
进行转义。我试过了
echo "h%h" | sed 's/%/i/g'
并且工作得很好,没有逃脱%
。这是否意味着不需要对%
进行转义?这是一个检查必要性的好方法吗?
更普遍的是:它们是在shell
和bash
中转义的相同字符吗
发布于 2017-06-16 12:52:21
使用print '%q'
technique,我们可以运行一个循环来找出哪些字符是特殊的:
#!/bin/bash
special=$'`!@#$%^&*()-_+={}|[]\\;\':",.<>?/ '
for ((i=0; i < ${#special}; i++)); do
char="${special:i:1}"
printf -v q_char '%q' "$char"
if [[ "$char" != "$q_char" ]]; then
printf 'Yes - character %s needs to be escaped\n' "$char"
else
printf 'No - character %s does not need to be escaped\n' "$char"
fi
done | sort
它给出了以下输出:
No, character % does not need to be escaped
No, character + does not need to be escaped
No, character - does not need to be escaped
No, character . does not need to be escaped
No, character / does not need to be escaped
No, character : does not need to be escaped
No, character = does not need to be escaped
No, character @ does not need to be escaped
No, character _ does not need to be escaped
Yes, character needs to be escaped
Yes, character ! needs to be escaped
Yes, character " needs to be escaped
Yes, character # needs to be escaped
Yes, character $ needs to be escaped
Yes, character & needs to be escaped
Yes, character ' needs to be escaped
Yes, character ( needs to be escaped
Yes, character ) needs to be escaped
Yes, character * needs to be escaped
Yes, character , needs to be escaped
Yes, character ; needs to be escaped
Yes, character < needs to be escaped
Yes, character > needs to be escaped
Yes, character ? needs to be escaped
Yes, character [ needs to be escaped
Yes, character \ needs to be escaped
Yes, character ] needs to be escaped
Yes, character ^ needs to be escaped
Yes, character ` needs to be escaped
Yes, character { needs to be escaped
Yes, character | needs to be escaped
Yes, character } needs to be escaped
一些结果,比如,
,看起来有点可疑。获得@CharlesDuffy在这方面的投入会很有趣。
发布于 2013-04-03 17:53:01
Bourne或POSIX shell中需要转义的字符与Bash中的字符不同。一般来说,Bash是这些shell的超集,所以在shell
中转义的任何东西都应该在Bash中转义。
一个很好的通用规则是“如果有疑问,就避开它”。但对某些字符进行转义会赋予它们特殊的含义,比如\n
。它们列在Quoting
和echo
下的man bash
页面中。
除此之外,转义任何非字母数字的字符,这是更安全的。我不知道有没有明确的清单。
手册页在某个地方列出了它们,但不是在一个地方。学习语言,这是确定的方法。
其中一个让我着迷的是!
。这是Bash (和csh)中的特殊字符(历史扩展),但在Korn shell中不是。即使是echo "Hello world!"
也会给出问题。像往常一样,使用单引号删除了特殊含义。
发布于 2013-04-03 17:54:55
我假设你说的是bash字符串。有不同类型的字符串具有不同的转义要求。例如:单引号字符串与双引号字符串不同。
最好的参考资料是bash手册的Quoting部分。
它解释了哪些字符需要转义。请注意,某些字符可能需要转义,这取决于启用了哪些选项,例如历史记录扩展。
https://stackoverflow.com/questions/15783701
复制相似问题