Linux Shell 之Meta

不同的命令可接受的命令行格式或有不同,一般情况下,一个标准的命令行格式为如下所列:

command-name options argument

若从技术细节来看,shell 会依据 IFS(Internal Field Seperator) 将 command line所输入的文字给拆解为”字段”(word)。然后再针对特殊字符(meta)先作处理,最后再重组整行 command line 。

其中的 IFS 是 shell 预设使用的栏位分隔符号,可以由一个及多个如下按键组成:

* 空白键(White Space)
* 表格键(Tab)
* 回车键(Enter)

meta

(1)IFS:由 三者之一组成(我们常用 space )。

(2)CR:由 产生。

IFS 是用来拆解 command line 的每一个词(word)用的,因为 shell command line是按词来处理的。而 CR 则是用来结束 command line 用的,这也是为何我们敲 命令就会跑的原因。

除了 IFS 与 CR ,常用的 meta 还有:

= : 设定变量。

$ : 作变量或运算替换(请不要与 shell prompt 搞混了)。

> :重导向 stdout。

< :重导向 stdin。 |:命令管线。 & :重导向 file descriptor ,或将命令置于背景执行。 ( ):将其内的命令置於 nested subshell 执行,或用於运算或命令替换。 { }:将其内的命令置於 non-named function 中执行,或用在变量替换的界定范围。 ; :在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 && :在前一个命令结束时,若返回值为 true,继续执行下一个命令。 || :在前一个命令结束时,若返回值为 false,继续执行下一个命令。 !:执行 history 列表中的命令

$ A=B C # 空白键未被关掉,作为 IFS 处理。
$ C: command not found. (FIXME)
$ echo $A
$ A="B C"     # 空白键已被关掉,仅作为空白键处理。
$ echo $A
B C
 
在第一次设定 A 变量时,由於空白键没被关闭,command line 将被解读为:A=B 然后碰到<ifs>,再执行 C 命令
 
在第二次设定 A 变量时,由於空白键被置于双引号中,因此被关闭,不再作为 IFS : A=B<space>C
 
事实上,空白键无论在单引号还是在双引号中,均会被关闭。Enter 键亦然:
<code lang="bash">
$ A='B
>C
>'
$ echo $A
B
C

在上例中,由於 被置于单引号当中,因此不再作为 CR 字符来处理。

这里的 单纯只是一个断行符号(new-line)而已, 由于command line 并没得到 CR 字符,因此进入第二个 shell prompt (PS2, > 符号表示),command line 并不会结束,一直到第三行,我们输入的 并不在单引号里面,因此并没被关闭,此时,command line 碰到 CR 字符,於是结束、交给 shell 来处理。

上例的 要是被置于双引号中的话,也会同样被关闭,用 escape 亦可:

$ A=B\
> C\
>
$ echo $A
B
C

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

3 weeks ago, this page was being read.

,

Subscribe to Comments