Linux系统中bash shell编程的10个基础问题讲解

2019-09-23 09:20:30王振洲

在上例中,由于<enter>被置于hard quote当中,因此不再作为CR字符来处理。这里的<enter>单纯只是一个断行符号(new-line)而已,由于command line并没得到CR字符,因此进入第二个shell prompt(PS2,以>符号表示),command line并不会结束,直到第三行,我们输入的<enter>并不在hard quote里面,因此并没被关闭,此时,command line碰到CR字符,于是结束、交给shell来处理。
上例的<enter>要是被置于soft quote中的话,CR也会同样被关闭:

$ A="B
> C
>"
$ echo $A
B C

然而,由于echo $A时的变量没至于soft quote中,因此当变量替换完成后并作命令行重组时,<enter>会被解释为IFS,而不是解释为New Line字符。

同样的,用escape亦可关闭CR字符:

$ A=B
> C
>
$ echo $A
BC

上例中,第一个<enter>跟第二个<enter>均被escape字符关闭了,因此也不作为CR来处理,
但第三个<enter>由于没被跳脱,因此作为CR结束command line。

但由于<enter>键本身在shell meta中的特殊性,在跳脱后面,仅仅取消其CR功能,而不会保留其IFS功能。

您或许发现光是一个<enter>键所产生的字符就有可能是如下这些可能:CR、IFS、NL(New Line)、FF(Form Feed)、NULL ...至于什么时候会解释为什么字符,这个我就没去深挖了,或是留给读者诸君自行慢慢摸索了…^_^

至于soft quote跟hard quote的不同,主要是对于某些meta的关闭与否,以$来作说明:

$ A=B C
$ echo "$A"
B C
$ echo '$A'
$A

在第一个echo命令行中,$被置于soft quote中,将不被关闭,因此继续处理变量替换,因此echo将A的变量值输出到荧幕,也就得到B C的结果。在第二个echo命令行中,$被置于hard quote中,则被关闭,因此$只是一个$符号,并不会用来作变量替换处理,因此结果是$符号后面接一个A字母:$A。

# 练习与思考:如下结果为何不同?
$ A=B C
$ echo '"$A"' #最外面的是单引号
"$A"
$ echo "'$A'" #最外面的是双引号
'B C'

(提示:单引号及双引号,在quoting中均被关闭了。)
在CU的shell版里,我发现有很多初学者的问题,都与quoting理解的有关。比方说,若我们在awk或sed的命令参数中调用之前设定的一些变量时,常会问及为何不能的问题。要解决这些问题,关键点就是:
区分出shell meta与command meta

前面我们提到的那些meta,都是在command line中有特殊用途的,比方说{ }是将其内一系列command line置于不具名的函式中执行(可简单视为command block),但是,awk却需要用{ }来区分出awk的命令区段(BEGIN,MAIN,END)。若你在command line中如此输入: