1. 单引号(’)
由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。如例程中的 ‘-1 day’,再比如:
$ string=’$PATH’
$ echo $string
$PATH
‘
string
’和
$
‘
string
’:
$后接单引号的$’string’,这在bash中被特殊对待:会将某些反斜线序列(如\n,\t,\”,\’等)继续转义,而不认为它是字面符号(如果没有$符号,单引号会强制将string翻译为字面符号,包括反斜线)
# echo 'a\nb'
a\nb
# echo $'a\nb'
a
b
2. 双引号(”)
由双引号括起来的字符,除$(美元符号)、\(反斜杠)、`(反引号)和”(双引号),如果开启了感叹号(!)引用历史命令时,感叹号要除外,这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。对于“$”来说,就是用其后指定的变量的值来代替这个变量和$;而对”号,若其前面没有加“\”,则Shell会将它同前一个”号匹配。如例程中的”-$i day”,会随着循环,将$i转换成其代表的值。
“string”
和$“string”
: 如果没有特殊定制bash环境或有特殊需求,$”string”和”string”是完全等价的,使用$””只是为了保证本地化。
3. 反引号(`)
这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。如例程中的`date -d ‘-1 day’ +%Y%m%d`就是把这条命令的结果赋给变量OPDATE。
(1)反引号可以嵌套使用,但需注意,嵌套使用时内层的反引号必须用反斜杠(\)将其转义。例如:
$ abc=`echo The number of users is \`who| wc -l\``
$ echo $abc
The number of users is 2
(2)在反引号之间的命令行中也可以使用shell的特殊字符。Shell为得到“中命令的结果,它实际上要去执行“中指定的命令。执行时,命令中的特殊字符,如$,”,?等又将具有特殊含义,并且“所包含的可以是任何一个合法的Shell命令,如:
$ ls
note readme.txt Notice Unix.dir
$ TestString="`echo $HOME ` ` ls [nN]*`"
$ echo $TestString
/home/yxz note Notice
反引号是一个老的用法,$()才是新的用法,如例程中的$(seq 10),$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。实际学习生活汇总,$()都是被推荐的用法,所以上面的的用法可以改成:
$ TestString="$(echo $HOME) $(ls [nN]*)"
$ echo $TestString
/home/yxz note Notice
4. 不加引号
把内容输出出来,可能不会将含有空格的字符串视为一个整体输出,如果内容中有命令,变量等,会先把变量命令解析结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用,不过最好用双引号替代之;
5. 转义字符(\)
它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。可以想见,在双引号中需要在前面加上“\”的只有四个字符$,\,’和”本身。