在具体介绍之前,需要先了解下引用的概念。所谓引用是指将字符串用某种符号括起来,以防止特殊字符被解析为其他意思。而在Shell中一共有4种 引用符 ,分别是 双引号 单引号 反引号 (在键盘上和波浪号位于同一个键)和 转义符 。其中双引号又叫“部分引用”或“弱引用”,可以引用除$符、反引号、转义符之外的所有字符;单引号又叫“全引用”或“强引用”,可以引用所有字符;反引号则会将反引号括起的内容解释为系统命令。

  • 部分引用(双引号)
  • 部分引用是指用双引号括起来的引用。在这种引用方式中,$符、反引号(`)、转义符(\)这3种特殊字符依然会被解析为特殊意义。比如,在定义一个变量后,使用echo打印该变量的时候,将它们用双引号括起来,如下所示:

    #声明变量 VAR01 并用echo打印出来,第一次直接打印,第二次用双引号括起来,从内容看好像没什么区别
    [root@localhost ~]# VAR01=100
    [root@localhost ~]# echo $VAR01
    [root@localhost ~]# echo "$VAR01"
    #声明变量 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

    单引号:所见即所得,即将单引号内的内容原样输出,任何字符都只会当成普通字符,除了单引号本身。

    双引号:把双引号内的内容输出出来,如果内容中有命令,变量等,会先把变量,命令解析出结果,然后再输出最终内容来。

    无引号:把内容输出出来,但可能不会将含有空格的字符串视为一个整体输出,如果内容中有命令,变量等,会先把变量,命令解析结果,然后再输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用,不过最好用双引号替代之。