分享 | 交流
让学习成为一种习惯

Shell 脚本中双引号、单引号、反引号的区别

最近要编个shell脚本处理数据,需要检测数据文件是否存在,文件名中包含日期,所以需要生成最近几天的日期,以便检测文件是否存在,看下面的脚本中如何使用双引号、单引号、反引号:

OPDATE=`date -d '-1 day' +%Y%m%d`  
 
for i in $(seq 10)  
do  
   FILEDATE=`date -d "-$i day" +%Y%m%d`  
   echo ${FILEDATE}  
done  

1、由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。如例程中的 ‘-1 day’,再比如:

$ string=’$PATH’
$ echo $string
$PATH
$

可见$保持了其本身的含义,作为普通字符出现。

2、由双引号括起来的字符,除$(美元符号)、\(反斜杠)、’(单引号)、和”(双引号)这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。对于“$”来说,就是用其后指定的变量的值来代替这个变量和$;对于“\”而言,是转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。可以想见,在双引号中需要在前面加上“\”的只有四个字符$,\,’和”本身。而对”号,若其前面没有加“\”,则Shell会将它同前一个”号匹配。如例程中的”-$i day”,会随着循环,将$i转换成其代表的值。

3、反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。如例程中的`date -d ‘-1 day’ +%Y%m%d`就是把这条命令的结果赋给变量OPDATE。

4、反引号还可以嵌套使用。但需注意,嵌套使用时内层的反引号必须用反斜杠(\)将其转义。例如:

abc=`echo The number of users is \`who| wc -l\``
$ echo $abc
The number of users is 2
$

5、在反引号之间的命令行中也可以使用shell的特殊字符。Shell为得到“中命令的结果,它实际上要去执行“中指定的命令。执行时,命令中的特殊字符,如$,”,?等又将具有特殊含义,并且“所包含的可以是任何一个合法的Shell命令,如:

$ ls
note readme.txt Notice Unix.dir
$ TestString="`echo $HOME ` ` ls [nN]*`"
$ echo $TestString
/home/yxz note Notice

最后,说句题外话: 反引号是一个老的用法,$()才是新的用法,如例程中的$(seq 10)。无论是在学习中,还是在实际工作中,$()都是被推荐的用法。所以上面的的用法可以改成:

$ TestString="$(echo $HOME) $(ls [nN]*)"
$ echo $TestString
/home/yxz note Notice

对于脚本的执行情况,可以用下面的命令来分析:
sh -x test.sh

1、转义
单引号和双引号都能关闭shell对特殊字符的处理。不同的是,双引号没有单引号严格,单引号关闭所有有特殊作用的字符,而双引号只要求shell忽略大多数,具体的说,就是①美元符号②反撇号③反斜杠,这3种特殊字符不被忽略;不忽略美元符号意味着shell在双引号内部也进行变量名替换。

1)单引号
硬转义,单引号内的字符就是其字面意义。阻止shell进行变量替换和解释特殊字符;对于后一种情况,单引号就是个转义字符,类似于反斜线。

2)双引号
会进行变量替换;将整个字符串解释为一个整体,即使参数里面含有空白字符也不会被shell分割开

3)反撇号,相当于$()–命令替换
会把命令执行的输出,替换;相当于函数调用,嵌套的变量会一直解析
① 把shell命令用反引号或者$(…)结构括起来,其中,$(…)格式受到POSIX标准支持,也利于嵌套
② 反撇号内不能再引用反撇号,而$()中可以引用反撇号
③ 要把$()引用命令与${}引用变量区分开来

4)反斜线
用作转义字符,阻止shell将后续字符解释成特殊字符

2、示例

1)****/home/edwardlewis/altraman # echo 'date'
date
****:/home/edwardlewis/altraman # echo "date"
date
****:/home/edwardlewis/altraman # echo `date`
Fri Aug 19 07:00:02 CST 2011

2)在脚本中:
a)newname=1.log_`date +%Y-%m-%d-%H-%M`
会输出:1.log_2011-10-13-21-27

b)tme=move_data.log_’date +%Y-%m-%d-%H-%M’
echo ${tme}
输出为:1.log_date +%Y-%m-%d-%H-%M

c)tme=move_data.log_”date +%Y-%m-%d-%H-%M”
echo ${tme}
输出为:1.log_date +%Y-%m-%d-%H-%M

3、其他[3]
1)command line的每一个charactor,分为如下两种:
*literal:普通纯文字,对shell 来说没特殊功能
*meta:对shell来说,具有特定功能的特殊保留字符
① IFS:由或或三者之一组成,用来拆解 command line的每一个词(word),因为command line 是按词来处理的。
② CR:由产生。CR 用来结束 command line
③ =:设定变量。
④ $:作变量或运算替换
⑤ >:重导向 stdout
⑥ <:重导向 stdin
⑦ |:管道
⑧ &:后台运行。
⑨ ():将其内的命令置于 嵌套子shell中执行,或用于运算或命令替换。
⑩ {}:将其内的命令置于non-named function中执行,或用在变量替换的界定范围

11 ;:在前一个命令结束时,忽略其返回值,继续执行下一个命令
12 &&:在前一个命令结束时,若返回值为 true,继续执行下一个命令
13 ||:在前一个命令结束时,若返回值为false,继续执行下一个命令。
14 !:执行 history 列表中的命令
2)假如需要在command line中将这些保留字符的功能关闭,就需要quoting处理。在bash中,常用的quoting 有三种方法:
① hard quote:’ ‘ (单引号),在 hard quote 中的所有meta 均被关闭
② soft quote:” ” (双引号),在soft quoe 中大部份meta都会被关闭,除$,`,\。
③ escape: \(反斜线),紧接 escape之后的单一meta被关闭

未经允许不得转载:留时刻运维网 » Shell 脚本中双引号、单引号、反引号的区别

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

留时刻 - Linux系统教程,运维经验分享

加入我们给我留言