shell学习笔记四--引用

这一篇我们主要讨论 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、  反斜杠不用成对出现,而单引号必须成对

你可能感兴趣的:(linux,shell,职场,bash,休闲)