您的位置:首页 > 运维架构 > Shell

shell中引号的用法

2013-05-30 16:02 169 查看
今天遇到个基本的问题,导致block了,测试script如下:

#!/bin/bash

NRG1=3

BE1=4

m=*_2013-05-27_11-55-10.tar

n=`echo "$m" | sed 's/*/backup_DB_recovery_"NRG1"_"BE1"/g'`(不对)

echo "$n"

执行后输出的结果为:

backup_DB_recovery_"NRG1"_"BE1"_2013-05-27_11-55-10.tar(错误的结果)

错误原因:

单引号和双引号的作用没有大搞明白

script修改如下:

#!/bin/bash

NRG1=3

BE1=4

m=*_2013-05-27_11-55-10.tar

n=`echo "$m" | sed "s/*/backup_DB_recovery_${NRG1}_${BE1}/g"`(正确)

echo "$n"

执行后的输出结果:

backup_DB_recovery_3_4_2013-05-27_11-55-10.tar(正确的结果)

###########################################################################

转载:shell中单引号和双引号的区别(总结的很不错)

###########################################################################

hard quote:单引号,关闭所有的meta(什么是meta,自己查吧)

soft quote:双引号,关闭大部分的meta,但是某些保留,例如$

这里也提一下escape:反斜杠,它只会关闭紧跟escape之后的字符。

参考cu上经典的十三问,hard quote关闭shell的meta,而soft quote关闭大部分的shell meta,但是$例外,对于bash的来说,命令的解释是从左到右的,首先遇到hard quote和soft
quote,所作的解释是不一样,看这个例子:

$ a=1

$ echo "$a"

1 #$被bash解释到

$ echo "'$a'"(单引号在里,双引号在外)

'1' #hard
quote被关闭

$ echo '$a'

$a #$被hard
quote关闭

$ echo '"$a"'(双引号在里,单引号在外)

"$a" #所有都被关闭了

如果能够理解上面的了,那基本知道怎么用单引号和双引号了。

而对于awk、ed等等命令,需要区分shell meta和command meta

对于awk来说,它的{ }:是将其内的命令置于non-named function 中执行,awk用{ }来区分命令段,例如BEGIN,END等等。举个例子:

$ awk {print $1} b.txt

awk: line 2: missing } near end of file

看看报错,如果直接使用{ },那么我们知道{ }没有被shell关闭,也就是说它看成shell的meta了,当然报错了,所以要关闭,同时shell中的$也关闭,也就是$需要成为awk的meta了,很好理解吧?如下输出了内容。

awk '{print $1}' b.txt

./0/137/qq/.zhangqx

./0/10/qq/.zyyao

./0/115/qq/.ywt

既然要要关闭{ },那么也可以用soft quote,

awk "{print $0}" b.txt

0

0

0

可以看到,soft quote预期的关闭了{ },但是$还是被shell解释了,这次我们可以用escape,将$关闭了。

$ awk "{print \$0}" b.txt

./0/137/qq/.zhangqx

./0/10/qq/.zyyao

./0/115/qq/.ywt

说到这里,可以大家都一点明白了,并不是awk '{ }' urfile是awk的固定语法,而是为了让awk能够跳脱shell的偷取其命令和参数,看看这个例子就明白了。

$ awk \{print\ \$0\} b.txt

./0/137/qq/.zhangqx

./0/10/qq/.zyyao

所作的一切是为了让awk或者自己的meta,请切记注意print后的空格,也要关闭,要不又被shell解释了。

2. 双引号 ( " " )

双引号作用与单引号类似,区别在于它没有那么严格。单引号告诉shell忽略所有特殊字符,而双引号只要求忽略大多数,具体说,括在双引号中的三种特殊字符不被忽略:$,\,` ,即双引号会解释字符串的特别意思,而单引号直接使用字符串.

3、. 反斜杠 backslash-escaped( \ )

反斜杠一般用作转义字符,或称逃脱字符,linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号

echo -e "\n"

反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。

BTW
4、$()和``的区别

反引号和$()的功能是命令替换,将反引号或$()中的字符串做为命令来执行,我们在用shell编程时经常用的到 将系统命令的执行结果赋给一个变量

但反引号内不能再引用反引号,而$()中可以引用反引号
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: