Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251272
  • 博文数量: 93
  • 博客积分: 3001
  • 博客等级: 中校
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-11 13:20
文章分类

全部博文(93)

文章存档

2011年(1)

2009年(92)

我的朋友

分类: 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.11.1  反斜杠

反斜杠用于引用(或转义)单个字符,使其免受解释。单引号里的反斜杠不会被解释。如果是在双括号里,反斜杠将保护美元符($)、反引号(``)和反斜杠不被解释。

范例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.11.2  单引号

单引号必须匹配成对。它们能保护所有元字符不被解释。要打印单引号,就必须用双引号把它括起来,或者用反斜杠转义它。

范例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解释。

13.11.3  双引号

双引号必须匹配成对。双引号允许对它所括的内容进行变量替换和命令替换,同时保护其他的特殊元字符不被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命令也被执行(请参见下面的命令替换”)

 

阅读(450) | 评论(0) | 转发(0) |
0

上一篇:文件名替换

下一篇:常用得正则表达式

给主人留下些什么吧!~~