命令

一个简单的shell命令,例如, echo a b c 由命令本身后跟参数(由空格分隔)组成。

更复杂的 Shell 命令由以各种方式排列在一起的简单命令组成:在管道中(一个命令的输出成为第二个命令的输入),在循环或条件构造中,或在其他一些分组中。

简单命令

简单命令是(可选的)一系列变量赋值, 紧接着是空白字符分隔的词和重定向符号, 最后以一个控制操作符结束. 第一个词指明了要执行的命令, 它被作为第 0 个参数. 其余词被作为这个命令的参数.

这个定义可以这样来理解:

1、 可以有变量赋值,例如

#!/usr/bin/env bash

a=10 b=10 export a b
1
2
3

2、 "词"是以空白字符分隔开的,空白字符包括制表符(tab)和空格,例如:

ls /tmp
1

就是两个词,一个 ls ,一个 /tmp

3、可以出现重定向符号,重定向符号是 >< ,例如:

echo “hello world”> /tmp/log
1

4、 简单命令结束于控制操作符,控制操作符包括:

||  
&   
&&     
;   
;;  
( )   
|  
<newline>
1
2
3
4
5
6
7
8

例如,用户输入:

ls /tmp
1

用户最后敲的回车键就是控制操作符 newline ,表示要结束这个简单命令。

如果用户输入:

echo "100" ; echo "200"
1

那么这是两个简单命令,第一个结束于";",第二个结束于newline。

5、 简单命令的第一个词是要执行的命令,其余的词都是这个命令的参数,例如:

echo “hello world” echo
1

第一个 echo 是命令,第二个词 "hello world" 是参数1,第三个词 echo 是参数2,而不再作为一个命令了。

简单命令是 shell 语法中最小的命令,通过简单命令的组合,又可以得到管道命令和列表命令。

管道

管道是一个或多个简单命令的序列,两个简单命令之间通过管道符号 | 来分隔

例如

echo "hello world" | wc –l
1

就是一个管道,它由两个简单命令组成,两个简单命令之间用管道符号分隔开。

我们可以看到,管道符号 | 也是属于上面提到的控制操作符。

根据这个定义,一个简单命令也同时是一个管道。

管道的作用是把它前面的那个简单命令的输出作为后面那个简单命令的输入,就上面这个例子来说:

echo "helloworld" 本来是要在标准输出(屏幕)上打印 "helloworld" 的,但是管道现在不让结果输出到屏幕上,而是"流" 到 wc –l 这个简单命令, wc –l 就把"流"过来的数据作为它的标准输入进行计算,从而统计出结果是 1 行。

关于管道更详细的内容,我们在后面具体实现管道的时候再说明。

列表

列表是一个或多个管道组成的序列,两个管道之间用操作符 ; , & , && , 或 || 分隔。我们看到,这几个操作符都属于控制操作符。

例如

echo "hello world" | wc –l ; echo “nice to meet you”
1

就是一个列表,它由两个管道组成,管道之间用分号(;)隔开

分号这种控制操作符仅仅表示一种执行上的先后顺序。

其他

复合命令, 协同处理, 并行处理