引用错误。在命令行中引用是很重要的。
这里只讲述引用的基本规则。因为使用引用的例子很多。本书接下来的两个部分将一一
予以讲述。脚本中执行行操作时, s h e l l将对脚本设置予以解释。要采取一种方法防止s h e l l这
样做,即使用引用号,包括各式引用或使用反斜线。
下面列出各种引用类型。
" " 双引号 ` 反引号
' ' 单引号 \ 反斜线
双引号:
使用双引号可引用除字符$、`、\外的任意字符或字符串。这些特殊字符分别为美元符号,
反引号和反斜线,对s h e l l来说,它们有特殊意义。如果使用双引号将字符串赋给变量并反馈
它,实际上与直接反馈变量并无差别。
[root@localhost huangcd]# string="nihao huang cheng du"
[root@localhost huangcd]# echo "$string"
nihao huang cheng du
[root@localhost huangcd]# echo $string
nihao huang cheng du
因为s h e l l将" "符号里的字符串赋予变量m y d a t e,d a t e已没有特定意义,故此变量只保存单
词d a t e。
[root@localhost huangcd]# mydate="date"
[root@localhost huangcd]# echo $mydate
date
如果要查询包含空格的字符串,经常会用到双引号。以下使用g r e p抽取名字“Davey Wi r e”,
因为没有加双引号, g r e p将“D a v e y”认作字符串,而把“Wi r e”当作文件名。
要解决这个问题,可将字符串加双引号。这样s h e l l会忽略空格,当使用字符时,应总是
使用双引号,无论它是单个字符串或是多个单词。
[root@localhost huangcd]# grep "Sabayon user" /etc/passwd
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
在一个反馈的文本行里可以使用双引号将变量引起来。下面的例子中, s h e l l反馈文本行,
遇到符号$,知道这是一个变量,然后用变量值b o y替换变量$ B O Y。
[root@localhost huangcd]# boy="BOY"
[root@localhost huangcd]# echo "The $boy did well"
The BOY did well
[root@localhost huangcd]# echo "the "$boy" did well"
the BOY did well
单引号:
单引号与双引号类似,不同的是s h e l l会忽略任何引用值。换句话说,如果屏蔽了其特殊
含义,会将引号里的所有字符,包括引号都作为一个字符串。使用上一个例子,结果如下:
[root@localhost huangcd]# girl='GIRL'
[root@localhost huangcd]# echo "the '$girl' did well"
the 'GIRL' did well
[root@localhost huangcd]# echo 'the '$girl' did well'
the GIRL did well
反引号:
反引号用于设置系统命令的输出到变量。s h e l l将反引号中的内容作为一个系统命令,并
执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用。
[root@localhost huangcd]# echo `hello`
bash: hello: command not found
[root@localhost huangcd]# echo `date`
2013年 12月 07日 星期六 10:51:55 CST
[root@localhost huangcd]# date +%A" the "%e" of "%B" "%Y
星期六 the 7 of 十二月 2013
打印当前系统上用户数目:
[root@localhost huangcd]# echo "`who|wc -l`"
2
反斜线:
如果下一个字符有特殊含义,反斜线防止s h e l l误解其含义,即屏蔽其特殊含义。下述字
符包含有特殊意义: & * + ^ $ ` " | ?。
上述语句同样可用于$ $命令, s h e l l解释其为现在进程I D号,使用反斜线屏蔽此意,仅打
印$ $。
[root@localhost huangcd]# echo \*
*
[root@localhost huangcd]# echo $$
4936
[root@localhost huangcd]# echo \$$
$$
1) 反馈字符串用双引号;但不要引用反馈本身。
2) 如果使用引用得到的结果不理想,再试另一种,毕竟只有三种引用方式,可以充分尝试。
使用命令e x p r时,用*表示乘法会出现错误,在*前加上反斜线才会正确。
[huangcd@localhost ~]$ expr 12*12
12*12
[huangcd@localhost ~]$ expr 12\*12
12*12
[huangcd@localhost ~]$ expr 12 \* 12
144
在e c h o命令中加入元字符,必须用反斜线起屏蔽作用。下面的例子要显示价格$ 1 9 . 9 9。其
中$屏蔽与不屏蔽将产生不同的结果。
[huangcd@localhost ~]$ echo "the price is $19.99"
the price is 9.99
[huangcd@localhost ~]$ echo "the price is \$19.99"
the price is $19.99