13.2.2 引用
引用是指将字符串用某种符号括起来,以防止特殊字符被解析为其他意思。比如说上一小节中的转义符就是一种引用。Shell中一共有4种引用符,分别是双引号、单引号、反引号(在键盘上和波浪号位于同一个键)和转义符。其中双引号又叫“部分引用”或“弱引用”,可以引用除$符、反引号、转义符之外的所有字符;单引号又叫“全引用”或“强引用”,可以引用所有字符;反引号则会将反引号括起的内容解释为系统命令。
1.部分引用
部分引用是指用双引号括起来的引用。在这种引用方式中,$符、反引号(`)、转义符(\)这3种特殊字符依然会被解析为特殊意义。比如,在定义一个变量后,使用echo打印该变量的时候,将它们用双引号括起来,如下所示:
- #
- 声明变量VAR03
- ,并用echo
- 打印出来。第一次直接打印,第二次用引号括起来,从输出内容看好像没什么区别
- [root@localhost ]# VAR03=100
- [root@localhost ]# echo $VAR03
- 100
- [root@localhost ]# echo "$VAR03"
- 100
- #
- 声明变量VAR03
- ,内容为字符串,ABC
- 之间有多个空格
- [root@localhost ]# VAR04="A B C"
- #
- 直接打印变量时,输出内容只保留了每个字母间一个空格
- [root@localhost ]# echo $VAR04
- A B C
- #
- 使用引号括起的输出内容和变量定义时的内容是完全一致的
- [root@localhost ]# echo "$VAR04"
- A B C
2.全引用
全引用是指用单引号括起来的引用。单引号中的任何字符都只当作是普通字符(除了单引号本身,也就是说单引号中间无法再包含单引号,即便用转义符转义单引号也不行)。所有在单引号中的字符都只能代表其作为字符的字面意义。如果用单引号引用之前声明的变量,输出的内容如下所示:
- [root@localhost ]# echo '$VAR03'
- $VAR03
- [root@localhost ]# echo '$VAR04'
- $VAR04
可以看到,输出内容就是单引号所括起来的所有内容,而不会将变量解析为其值。
如果全引用括起的字符串中还含有单引号,则会出现问题,因为Shell无法区分哪个单引号是引用的结束符,就像下面显示的一样:
- [root@localhost ~]# echo 'It's a dog'
- >
想要解决这个问题,可以采取如下两种方式:
- [root@localhost ~]# echo 'It'\''s a dog'
- It's a dog
- [root@localhost ~]# echo "It's a dog"
- It's a dog
单引号和双引号在很多时候是一样的,只是要记住,在双引号中的$符、反引号、转义符还是会被解析成其特殊含义,而在单引号中所有的字符都只是字面意思。下面的例子中,使用双引号括起的内容中,$PWD被解析成/root,而在单引号中只是按照原样输出“$PWD”字符。
- [root@localhost ~]# echo "Current directory is $PWD"
- Current directory is /root
- [root@localhost ~]# echo 'Current directory is $PWD'
- Current directory is $PWD