分类: LINUX
2009-07-11 18:12:12
引用被用来保护特殊的元字符不被解释和禁止参量扩展。引用有3种方式:反斜杠、单引号和双引号。表13-22列出的字符对shell而言都是特殊的,必须加引号。
表13-22 需要引用的特殊元字符
元 字 符 |
含 义 |
; |
命令分隔符 |
& |
后台处理 |
( ) |
命令编组。创建子shell |
{ } |
命令编组。不创建子shell |
| |
管道 |
< |
输入重定向 |
> |
输出重定向 |
newline |
命令终止 |
space/tab |
词分隔符 |
$ |
变量替换字符 |
* [ ] ? |
用于文件名扩展的shell元字符 |
单引号和双引号都必须成对出现。单引号保护特殊元字符(如$、*、?、|、>和<)免受解释。双引号也能保护特殊元字符不受解释,但它允许处理变量替换字符(美元符)和命令替换字符(反引号)。单引号可以保护双引号,双引号也会保护单引号。
和Bourne shell不一样,如果有不匹配的引号,bash会设法通知你。在交互式运行状态下,如果引号不匹配,就会出现次提示符。运行shell脚本时,shell先扫描文件,如果有引号不匹配,shell会试图找到下一个引号来匹配它。如果这种尝试失败,程序就会异常终止,终端上将出现这样一条信息:“bash:unexpected EOF while looking for `"`”。即使是顶尖的shell程序员高手,也会遇到引用导致的问题。关于shell引用规则,请参见附录C。
反斜杠用于引用(或转义)单个字符,使其免受解释。单引号里的反斜杠不会被解释。如果是在双括号里,反斜杠将保护美元符($)、反引号(``)和反斜杠不被解释。
范例13-72
1 $ echo Where are you going\?
Where are you going?
2 $ echo Start on this line and \
> go to the next line.
Start on this line and go to the next line.
3 $ echo \\
\
4 $ echo '\\'
\\
5 $ echo '\$5.00'
\$5.00
6 $ echo "\$5.00"
$5.00
7 $ echo 'Don\'t you need $5.00?'
>
>'
Don\t you need .00?
说明
1. 反斜杠阻止shell对问号执行文件名替换。
2. 反斜杠转义换行符,让下一行能成为当前行的一部分。
3. 反斜杠本身也是特殊字符,因此它阻止shell解释跟在它后面的那个反斜杠。
4. 括在单引号里的反斜杠不会被解释。
5. 单引号里的所有字符都被当成字面字符。此处的单引号没有任何特殊目的。
6. 括在双引号里时,反斜杠保护美元符不因变量替换而被解释。
7. 单引号内的反斜杠不会被解释。因此,shell将看到3个单引号(串尾那个未能匹配成对)。屏幕上出现次提示符,等待用户输入用于结束的单引号。如果最终输入了这个引号,shell就将剔除该字符串中的全部引号,然后将它传给echo命令。因为前两个引号匹配成对了,所以字符串的剩余部分t you need $5.00?没有被括在引号中。shell将试着对$5求值,结果为空,因此打印出.00。
单引号必须匹配成对。它们能保护所有元字符不被解释。要打印单引号,就必须用双引号把它括起来,或者用反斜杠转义它。
范例13-73
1 $ echo 'hi there
> how are you?
> When will this end?
> When the quote is matched
> oh'
hi there
how are you?
When will this end?
When the quote is matched
oh
2 $ echo Don\'t you need '$5.00?'
Don't you need $5.00?
3 $ echo 'Mother yelled, "Time to eat!"'
Mother yelled, "Time to eat!"
说明
1. 单引号没能在这一行内匹配,所以bash shell显示一个次提示符,等着引号被匹配。
2. 单引号保护所有的元字符不被解释。“Don't”里的引号被反斜杠转义(反斜杠保护的对象是单个字符,而不是一个串)。否则它就会去匹配第一个单引号,导致字符串末尾的那个单引号配不成对。$和?被括在一对单引号中,不让shell解释它们。即,将它们当成字面字符。
3. 单引号保护字符串中的双引号不被shell解释。
双引号必须匹配成对。双引号允许对它所括的内容进行变量替换和命令替换,同时保护其他的特殊元字符不被shell解释。
范例13-74
1 $ name=Jody
2 $ echo "Hi $name, I'm glad to meet you!"
Hi Jody, I'm glad to meet you!
3 $ echo "Hey $name, the time is $(date)"
Hey Jody, the time is Wed Jul 14 14:04:11 PST 2004
说明
1. 将变量name赋值为字符串Jody。
2. 字符串两端的双引号将保护所有的特殊元字符不被shell解释,$name中的$是个例外。这个例子在双引号里执行了变量替换。
3. 变量替换和命令替换都可以在双引号中执行。这个例子中,变量name被展开,反引号中的date命令也被执行(请参见下面的“命令替换”)。