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

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

literal:也就是普通纯文字,对shell来说没特殊功能。 meta:对shell来说,具有特定功能的特殊保留字元。(注一:关于bash shell在处理command line时的顺序说明,请参考O'Reilly出版社之Learning the Bash Shell,2nd Edition,第177 - 180页的说明,尤其是178页的流程图Figure 7-1…)

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