shell 中单引号,双引号,不加引号的区别
在具体介绍之前,需要先了解下引用的概念。所谓引用是指将字符串用某种符号括起来,以防止特殊字符被解析为其他意思。而在Shell中一共有4种引用符,分别是双引号、单引号、反引号(在键盘上和波浪号位于同一个键)和转义符。其中双引号又叫“部分引用”或“弱引用”,可以引用除$符、反引号、转义符之外的所有字符;单引号又叫“全引用”或“强引用”,可以引用所有字符;反引号则会将反引号括起的内容解释为系统命令。
- 部分引用(双引号)
部分引用是指用双引号括起来的引用。在这种引用方式中,$符、反引号(`)、转义符(\)这3种特殊字符依然会被解析为特殊意义。比如,在定义一个变量后,使用echo打印该变量的时候,将它们用双引号括起来,如下所示:
#声明变量 VAR01 并用echo打印出来,第一次直接打印,第二次用双引号括起来,从内容看好像没什么区别 [root@localhost ~]# VAR01=100 [root@localhost ~]# echo $VAR01 100 [root@localhost ~]# echo "$VAR01" 100 #声明变量 VAR02 内容为字符串,ABC 之间有多个空格 [root@localhost ~]# VAR02="A B C" #直接打印变量时,输出内容只保留了每个字幕间一个空格 [root@localhost ~]# echo $VAR02 A B C #使用双引号括起的输出内容和变量定义时的内容是完全一致的 [root@localhost ~]# echo "$VAR02" A B C
- 全部引用(单引号)
全引用是指用单引号括起来的引用。单引号中的任何字符都只当作是普通字符(除了单引号本身,也就是说单引号中间无法再包含单引号,即便用转义符转义单引号也不行)。所有在单引号中的字符都只能代表其作为字符的字面意义。如果用单引号引用之前声明的变量,输出的内容如下所示:
[root@localhost ~]# echo '$VAR01' $VAR01 [root@localhost ~]# echo '$VAR02' $VAR02
可以看到,输出内容就是单引号所括起来的所有内容,而不会将变量解析为其值。如果全引用括起的字符串中还含有单引号,则会出现问题,因为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
总结:
单引号:所见即所得,即将单引号内的内容原样输出,任何字符都只会当成普通字符,除了单引号本身。
双引号:把双引号内的内容输出出来,如果内容中有命令,变量等,会先把变量,命令解析出结果,然后再输出最终内容来。
无引号:把内容输出出来,但可能不会将含有空格的字符串视为一个整体输出,如果内容中有命令,变量等,会先把变量,命令解析结果,然后再输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用,不过最好用双引号替代之。