还是回到我们的command line来吧...
经过前面两章的学习,应该很清楚当你在shell prompt后面敲打键盘、直到按下Enter的时候,你输入的文字就是command line了,然后shell才会以行程的方式执行你所交给它的命令。但是,你又可知道:你在command line输入的每一个文字,对shell来说,是有类别之分的呢?
简单而言(我不敢说这是精确的定议,注一),command line的每一个charactor,分为如下两种:
* 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 quoe中大部份meta都会被关闭,但某些则保留(如$,反引号,反斜杠)。
* escape:/(反斜线),只有紧接在escape (跳脱字符)之后的单一meta才被关闭。
下面的例子将有助于我们对quoting的了解:
$ A=B C #空格键未被关掉,作为IFS处理。 |