Shell脚本深入教程:理解Shell的单双引号
理解Shell的单双引号
Shell的引号是一个重要知识点,也是Shell最难的知识点。虽然Bash的引号解析规则很简单,但是想要一次性写出正确的复杂的命令行是很难的,如果不理解引用规则,调试引号问题会花费很长时间。
对于Shell中引号的使用,有如下结论:
\、$、`(反引号)
除外,如果开启了
!
引用历史命令时,则感叹号也除外。所以:
-
双引号内可用反斜线转义双引号本身,使得双引号变成普通字符,例如
echo "hel\"lo"
- 双引号内可以执行命令替换、变量替换、反斜线转义、算术运算等,但不能执行大括号扩展、波浪号扩展、通配符路径扩展等
- 成对的双引号内出现命令替换时,命令替换是先执行的,因此命令替换部分单独解析引号,也因此命令替换内部的引号不和外部引号进行从左向右的配对
-
(3).单引号:单引号内的所有字符全部变为字面符号符号。但注意:单引号内不能再使用单引号,即使使用了反斜线转义也不允许
- 所以,单引号内所有Shell扩展和替换都不执行
- 每一个命令替换都开启一个新的独立的命令行解析上下文,包括对引号的解析 。也就是说,命令替换中的引号和命令替换外部的引号互不影响。并且,命令替换中嵌套的命令替换,命令行解析上下文也是独立的。
1
2输出单引号
echo "hello'world"在Shell开始词法分析时,首先读取到双引号,于是会继续向后读取,直到遇到另一个配对的双引号作为引用结束,其中中间会读到单引号,它是在双引号范围内的,所以它不需要配对。
其它示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17输出双引号
echo 'hello"world'
echo "hello\"world"$ ''
和$ ""
有些时候命令行中是加单引号还是双引号是非常难处理的,如果在考虑了单双引号之后还是难以为继,不妨考虑以下使用
$''
,当然还有一个$""
。(1).如果没有特殊定制bash环境或有特殊需求,
$"string"
和"string"
是完全等价的,使用$""
只是为了保证本地化。以下是
man bash
关于$""
的解释: