在上例中,由于<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中如此输入:










