首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Bash时,哪些字符需要转义?

使用Bash时,哪些字符需要转义?
EN

Stack Overflow用户
提问于 2013-04-03 17:32:50
回答 3查看 457.7K关注 0票数 254

在Bash中是否有需要转义的字符的全面列表?能否仅使用sed进行检查

特别是,我正在检查是否需要对%进行转义。我试过了

代码语言:javascript
复制
echo "h%h" | sed 's/%/i/g'

并且工作得很好,没有逃脱%。这是否意味着不需要对%进行转义?这是一个检查必要性的好方法吗?

更普遍的是:它们是在shellbash中转义的相同字符吗

EN

回答 3

Stack Overflow用户

发布于 2017-06-16 12:52:21

使用print '%q' technique,我们可以运行一个循环来找出哪些字符是特殊的:

代码语言:javascript
复制
#!/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

它给出了以下输出:

代码语言:javascript
复制
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在这方面的投入会很有趣。

票数 35
EN

Stack Overflow用户

发布于 2013-04-03 17:53:01

Bourne或POSIX shell中需要转义的字符与Bash中的字符不同。一般来说,Bash是这些shell的超集,所以在shell中转义的任何东西都应该在Bash中转义。

一个很好的通用规则是“如果有疑问,就避开它”。但对某些字符进行转义会赋予它们特殊的含义,比如\n。它们列在Quotingecho下的man bash页面中。

除此之外,转义任何非字母数字的字符,这是更安全的。我不知道有没有明确的清单。

手册页在某个地方列出了它们,但不是在一个地方。学习语言,这是确定的方法。

其中一个让我着迷的是!。这是Bash (和csh)中的特殊字符(历史扩展),但在Korn shell中不是。即使是echo "Hello world!"也会给出问题。像往常一样,使用单引号删除了特殊含义。

票数 18
EN

Stack Overflow用户

发布于 2013-04-03 17:54:55

我假设你说的是bash字符串。有不同类型的字符串具有不同的转义要求。例如:单引号字符串与双引号字符串不同。

最好的参考资料是bash手册的Quoting部分。

它解释了哪些字符需要转义。请注意,某些字符可能需要转义,这取决于启用了哪些选项,例如历史记录扩展。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15783701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档