双引号
双引号中包含的特殊字符(通配符和元字符)将失去他们的特殊意义(美元符号"$",反斜杠"\",反引号"`" 这个三个字符除外),将被当作普通字符。
示例一:
//
双引号中,通配符*和?将失去其通配符的意义,只是一个普通的字符
[root@linux ~]# echo /usr/*
/usr/bin /usr/etc /usr/games /usr/include /usr/lib /usr/lib64 /usr/libexec /usr/local /usr/sbin /usr/share /usr/src /usr/tmp
[root@linux ~]# echo "/usr/*"
/usr/*
[root@hadoop002 ~]# touch {a,b,c}123
[root@hadoop002 ~]# ls
a123 c123 d123
[root@hadoop002 ~]# echo ?123
a123 c123 d123
[root@hadoop002 ~]# echo "?123"
?123
//
双引号中,$符号 反引号` 反斜杠\ 依然具有特殊意义
说明:反斜杠只有当其后面的字符是$, ', ", \ 或者换行符时才保留其特殊的含义。
在双引号中,
如果反斜杠
后面是这些字符中的任意一个,
则这个反斜杠就会被删除。
而如果它后面的字符没有特殊的含义,则它将被保留。
[root@linux ~]# str="i love china"
[root@linux ~]# echo "$str"
i love china
[root@linux ~]# echo "`pwd`"
/root
[root@linux ~]# echo "\$"
$
[root@linux ~]# echo "\a"
\a
示例二:
[root@linux ~]# echo i love china
i love china
[root@linux ~]# echo "i love china"
i love china
上述示例中的区别很明显,默认情况下,linux会把空格、制表符、换行符当作单词之间的界定符。即如果没有被引号包含起来的空格、制表符和换行符都不会被当作文本的一部分,只是用来做单词分隔。这一示例再次说明在双引号中特殊字符(如:space,tab,newline)将失去其特殊意义。
一个有趣的例子:
[root@linux ~]# cal
七月 2017
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
[root@linux ~]# echo $(cal)
七 2017 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
[root@linux ~]# echo "$(cal)"
七月 2017
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
第二条命令中,由于cal命令的输出没有被引号包含,那么命令输出中的制表符、换行符都只是被当作了普通的单词分隔符。shell会认为echo后面有多个参数,所以输出了一行信息。
单引号
单引号中包含的特殊字符都将失去其特殊意义,所谓的所见即所得。
看如下示例:
[root@linux ~]# echo text ~/* {1,2,3} $(echo hello) $((3*3)) $PWD
text /root/anaconda-ks.cfg 1 2 3 hello 9 /root
[root@linux ~]# echo "text ~/* {1,2,3} $(echo hello) $((3*3)) $PWD"
text ~/* {1,2,3} hello 9 /root
[root@linux ~]# echo 'text ~/* {1,2,3} $(echo hello) $((3*3)) $PWD'
text ~/* {1,2,3} $(echo hello) $((3*3)) $PWD
可以看到单引号让所有的特殊字符失去了特殊意义