这一篇我们主要讨论
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
,而
Goldberg
和
phonebook
都是文件名(
shell
这么理解的)。所以
shell
会告诉我们
grep: Goldberg: No such file or directory
(文件或目录不存在)。尽管
shell
判断文件
Goldber
不存在,它依然认为我们给了它两个文件名,所以结果出现的文件名
phonebook
就在情理中了。
回到我们的问题,精确查找
Susan Goldberg
所在的行。我们需要把
Susan Goldberg
(包作为
pattern
给
grep
处理,包括之间的空格。这时我们需要去除空格在
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、 反斜杠不用成对出现,而单引号必须成对