Literal没甚么好谈的,凡举abcd、123456这些“文字”都是literal…(easy?)。但meta却常使我们困惑…..(confused?)事实上,前两章我们在command line中已碰到两个机乎每次都会碰到的meta:
IFS:由<space>或<tab>或<enter>三者之一组成(我们常用space)。 CR:由<enter>产生。IFS是用来拆解command line的每一个词(word)用的,因为shell command line是按词来处理的。而CR则是用来结束command line用的,这也是为何我们敲<enter>命令就会跑的原因。除了IFS与CR,常用的meta还有:
= : 设定变量。 $ : 作变量或运算替换(请不要与shell prompt搞混了)。 > : 重导向stdout。 < : 重导向stdin。 | : 命令管线。 & : 重导向file descriptor,或将命令置于背境执行。 () : 将其内的命令置于nested subshell执行,或用于运算或命令替换。 {} : 将其内的命令置于non-named function中执行,或用在变量替换的界定范围。 ; : 在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 && : 在前一个命令结束时,若返回值为true,继续执行下一个命令。 || : 在前一个命令结束时,若返回值为false,继续执行下一个命令。 !: 执行history列表中的命令...
假如我们需要在command line中将这些保留字元的功能关闭的话,就需要quoting处理了。在bash中,常用的quoting有如下三种方法:
hard quote:' '(单引号),凡在hard quote中的所有meta均被关闭。
soft quote:“”(双引号),在soft quote中大部份meta都会被关闭,但某些则保留(如$)。(注二:在soft quote中被豁免的具体meta清单,我不完全知道,有待大家补充,或透过实作来发现及理解。)
escape : (反斜线),只有紧接在escape(跳脱字符)之后的单一meta才被关闭。
下面的例子将有助于我们对quoting的了解:
$ A=B C #空白键未被关掉,作为IFS处理。 $ C: command not found. $ echo $A $ A="B C" #空白键已被关掉,仅作为空白键处理。 $ echo $A B C
在第一次设定A变量时,由于空白键没被关闭,command line将被解读为:A=B然后碰到<IFS>,再执行C命令
在第二次设定A变量时,由于空白键被置于soft quote中,因此被关闭,不再作为IFS:A=B<space>C
事实上,空白键无论在soft quote还是在hard quote中,均会被关闭。Enter键亦然:
$ A='B > C > ' $ echo "$A" B C










