这一篇我们主要讨论shell中的引用,本篇内容不多,之所有要单独篇幅来讨论是因为它很重要而且相对比较独立。我们要介绍的引用方法包括以下内容:
单引号
双引号
反斜杠\
反引号`
命令引用$( )
 
一、单引号
我们前面介绍了变量,还介绍了文件名替换中的特殊符号*和命令行中空格的意义。如果变量或者命令行中出现了shell特殊字符,应该怎么处理呢?还是举例子吧:
$ cat phonebook
Alice Chebba    973-555-2015
Barbara Swingle 201-555-9257
Billy Bach      201-555-7618
Liz Stachiw     212-555-2298
Susan Goldberg  201-555-7776
Susan Topple    212-555-4932
Tony Iannino    973-555-1295
$ grep Susan phonebook
Susan Goldberg  201-555-7776
Susan Topple    212-555-4932
$
我们知道,grep可以知道含有特定模式的行,这里找出了显示了包含字符Susan的行,结果有2行。如果我们想精确查找Susan Goldberg所在的行呢?
$ grep Susan Goldberg phonebook
grep: Goldberg: No such file or directory
phonebook:Susan Goldberg        201-555-7776
phonebook:Susan Topple  212-555-4932
$
可以看到,shell先抛出了一个错误,然后显示了包含Susan的行,而且前面还有文件名,这一系列的结果似乎并不在我们的意料之内。我们先来回顾一下grep的语法规则:
grep pattern file(s)
按照这个规则,我们不难理解shell在想些什么:命令行
grep Susan Goldberg phonebook
中,Susan是模式pattern,而Goldbergphonebook都是文件名(shell这么理解的)。所以shell会告诉我们grep: Goldberg: No such file or directory(文件或目录不存在)。尽管shell判断文件Goldber不存在,它依然认为我们给了它两个文件名,所以结果出现的文件名phonebook就在情理中了。
回到我们的问题,精确查找Susan Goldberg所在的行。我们需要把Susan Goldberg(包作为patterngrep处理,包括之间的空格。这时我们需要去除空格在shell中特殊意义(还记得吗,空格是命令行参数分隔符之一),单引号可以帮我们解决这个问题:
$ grep 'Susan Goldberg' phonebook
Susan Goldberg  201-555-7776
$
这次我们得到了想要的结果,shell去掉了空格的特殊意义,把Susan Goldberg当作pattern来处理了。单引号的作用就是屏蔽shell中特殊字符的意义,使他们变成普通字符。
成对的单引号可以屏蔽所有字符,甚至是换行符。还是继续看例子:
$ file=/home/steve/bin/prog1
$ echo $file
/home/steve/bin/prog1
$ echo ‘$file’
$file
$
使用单引号引用$file时,shell原封不动的显示了它们。这时符号$的变量替换意义被屏蔽了。
$ echo *
1.bak  2.bak  3.bak  urfile
$ echo ‘*’
*
$
使用单引号引用*时,shell原封不动的显示了*。这时符号*的文件名替换意义被屏蔽了。
当使用单引号对时,我们甚至不需要知道什么符号有特殊意义。
 
二、双引号
双引号和单引号的作用差不多,区别在于双引号没有那么严格。单引号告诉shell屏蔽所有字符的特殊意义,而双引号只要求忽略大多数。具体地说,括在双引号中的以下三种字符不被屏蔽:
美元符号$
反斜杠\
反引号`
不屏蔽美元符号的特殊意义,意味着在双引号内部也进行变量名替换。
$echo “$file”
/home/steve/bin/prog1
$
变量file的值被显示了出来。
$ x=*
$ echo $x
1.bak  2.bak  3.bak  urfile
$ echo “$x”
*
$
这个例子中,变量x的值*被替换并显示了出来。为什么结果不是文件名的列表呢?x变量被替换后,结果为
    echo “*”
*在双引号中也是被屏蔽的(不屏蔽的只有$等三中符号),所以结果只显示*。所以,如果希望替换变量的值,而又不希望shell把替换的结果当做特殊字符对待,就应该把变量名放在双引号中。
可以用双引号来对shell隐藏单引号,反之亦然。
 
三、反斜杠
反斜杠\的作用与单引号相似,能够屏蔽所有字符(包括反斜杠)的特殊意义。与单引号的区别在于:

1、  反斜杠不用成对出现,而单引号必须成对

2、  反斜杠只屏蔽紧跟在之后的单个字符,评比多少字符就需要多少个反斜杠