- 论坛徽章:
- 1
|
本帖最后由 L_kernel 于 2010-11-19 22:11 编辑
上一章介绍了变量和替换操作,在脚本中执行变量替换时最容易犯的一个错误就是由于
引用错误。在命令行中引用是很重要的。
本章内容有:
• 引用的必要性。
• 双引、单引和反引号。
• 使用反斜线实现屏蔽。
引用必要性
这里只讲述引用的基本规则。因为使用引用的例子很多。本书接下来的两个部分将一一
予以讲述。脚本中执行行操作时, s h e l l将对脚本设置予以解释。要采取一种方法防止s h e l l这
样做,即使用引用号,包括各式引用或使用反斜线。
一些用户在对文本字符串进行反馈操作时觉得使用引用很麻烦。有时不注意,只引用了
一半,这时问题出现了。最好在反馈文本字符串时使用双引号。下面是各种引用的例子。- [mutter@localhost ~] $ echo Hit the star button to exit *
- Hit the star button to exit child.sh father.sh findfile.sh param2.sh param.sh who_is.sh
复制代码 文本返回了,但由于未使用双引号, *被s h e l l误解,s h e l l认为用户要做目录列表。用双引
号得结果如下:
[mutter@localhost ~] $ echo "Hit the star button to exit *"
Hit the star button to exit *
这样就不会有误解产生。表1 5 - 1列出各种引用类型。
表15-1 shell引用类型
" " 双引号` 反引号
' ' 单引号\ 反斜线
双引号
使用双引号可引用除字符$、`、\外的任意字符或字符串。这些特殊字符分别为美元符号,
反引号和反斜线,对s h e l l来说,它们有特殊意义。如果使用双引号将字符串赋给变量并反馈
它,实际上与直接反馈变量并无差别。- [mutter@localhost ~] $ STRING="MAY DAY, MAY DAY, GOING DOWN"
- [mutter@localhost ~] $ echo "$STRING"
- MAY DAY, MAY DAY, GOING DOWN
- [mutter@localhost ~] $ echo $STRING
- MAY DAY, MAY DAY, GOING DOWN
复制代码 现在假定要设置系统时间输出到变量m y d a t e。- [mutter@localhost ~] $ MYDATE="date"
- [mutter@localhost ~] $ echo $MYDATE
- date
复制代码 因为s h e l l将" "符号里的字符串赋予变量m y d a t e,d a t e已没有特定意义,故此变量只保存单
词d a t e。
如果要查询包含空格的字符串,经常会用到双引号。以下使用g r e p抽取名字“Davey Wi r e”,
因为没有加双引号, g r e p将“D a v e y”认作字符串,而把“Wi r e”当作文件名。- [mutter@localhost ~] $ grep Davey Wire /etc/passwd
- grep: Wire: No such file or directory
- [mutter@localhost ~] $ grep "Davey Wire" /etc/passwd
复制代码 要解决这个问题,可将字符串加双引号。这样s h e l l会忽略空格,当使用字符时,应总是
使用双引号,无论它是单个字符串或是多个单词。
在一个反馈的文本行里可以使用双引号将变量引起来。下面的例子中, s h e l l反馈文本行,
遇到符号$,知道这是一个变量,然后用变量值b o y替换变量$ B O Y。- [mutter@localhost ~] $ echo " The $BOY did well"
- The boy did well
- [mutter@localhost ~] $ echo " The "$BOY" did well"
- The boy did well
复制代码 单引号与双引号类似,不同的是s h e l l会忽略任何引用值。换句话说,如果屏蔽了其特殊
含义,会将引号里的所有字符,包括引号都作为一个字符串。使用上一个例子,结果如下:- [mutter@localhost ~] $ GIRL='girl'
- [mutter@localhost ~] $ echo "The '$GIRL' did well"
- The 'girl' did well
复制代码 反引号
反引号用于设置系统命令的输出到变量。s h e l l将反引号中的内容作为一个系统命令,并
执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用。下面将
举例说明。
下面的例子中, s h e l l试图替代单词h e l l o为系统命令并执行它,因为h e l l o脚本或命令不存
在,返回错误信息。- [mutter@localhost ~] $ echo `hello`
- bash: hello: command not found
复制代码- [mutter@localhost ~] $ echo `date`
- Sat Nov 20 21:40:47 CST 2010
复制代码 这次命令有效,s h e l l正确执行。
下面将命令输出设置为变量m y d a t e,时间格式如下:- [mutter@localhost ~] $ date +%A" the "%e" of "%B" "%Y
- Saturday the 20 of November 2010
- [mutter@localhost ~] $ mydate=`date +%A" the "%e" of "%B" "%Y`
- [mutter@localhost ~] $ echo $mydate
- Saturday the 20 of November 2010
- [mutter@localhost ~] $ mydate=`date`
- [mutter@localhost ~] $ echo $mydate
- Sat Nov 20 21:43:06 CST 2010
复制代码 另一个例子中,将反引号嵌在双引号里:- [mutter@localhost ~] $ echo "The date today is `date`"
- The date today is Sat Nov 20 21:44:03 CST 2010
- [mutter@localhost ~] $ echo "There are `who | wc -l` users on the system"
- There are 3 users on the system
复制代码 上面的例子中,打印字符串后, s h e l l遇到反引号,将其看作一条命令执行它。
如果下一个字符有特殊含义,反斜线防止s h e l l误解其含义,即屏蔽其特殊含义。下述字
符包含有特殊意义: & * + ^ $ ` " | ?。
假定e c h o命令加*,意即以串行顺序打印当前整个目录列表,而不是一个星号*。- [mutter@localhost ~] $ echo *
- child.sh father.sh findfile.sh param2.sh param.sh who_is.sh
复制代码 为屏蔽星号特定含义,可使用反斜线。上述语句同样可用于$ $命令, s h e l l解释其为现在进程I D号,使用反斜线屏蔽此意,仅打
印$ $。- [mutter@localhost ~] $ echo $
- 7906
- [mutter@localhost ~] $ echo \$
- $
复制代码 在打印字符串时要加入八进制字符( A S C I I相应字符),必须在前面加反斜线,否则s h e l l
将其当作普通数字处理。- [mutter@localhost ~] $ echo " This is a copyright 251 sign"
- This is a copyright 251 sign
复制代码 [mutter@localhost ~] $ echo -e " This is a copyright \0373 sign"
This is a copyright
- [quote]Linux下需要使用\0NNN的八进制的方式才可以把特殊字符copyright的字符显示出来。[/quote]
- 使用命令e x p r时,用*表示乘法会出现错误,在*前加上反斜线才会正确。
- [code][mutter@localhost ~] $ expr 12 * 12
- expr: syntax error
- [mutter@localhost ~] $ expr 12 \* 12
- 144
复制代码 在e c h o命令中加入元字符,必须用反斜线起屏蔽作用。下面的例子要显示价格$ 1 9 . 9 9。其
中$屏蔽与不屏蔽将产生不同的结果。- [mutter@localhost ~] $ echo "That video looks a good price for $19.99"
- That video looks a good price for 9.99
- [mutter@localhost ~] $ echo "That video looks a good price for \$19.99"
- That video looks a good price for $19.99
复制代码 使用反斜线屏蔽$,可得更好的结果。 |
|