Compound Commands 复合命令

compound command(复合命令) 是如下情况之一:

(list)

list 序列将在一个子 shell 中执行。变量赋值和影响 shell 环境变量的内建命令在命令结束后不会再起作用。 返回值是序列的返回值。

{ list; }

list 序列将在当前 shell 环境中执行。序列必须以一个新行符或分号结束。 这种做法也称为 group command(命令组)。返回值是序列的返回值。注意与元字符 () 不同, {}reserved words(保留字),必须出现在能够识别保留字的场合。 由于它们不会产生断词(cause a word break),它们和序列之间必须用空格分开。

((expression))

表达式 expression 将被求值。求值规则在下面的 算术求值(ARITHMETICEVALUATION) 章节中描述。如果表达式的值非零,返回值就是 0;否则返回值是 1。这种做法和 let "expression" 等价。

[[ expression ]]

返回 0 或 1,取决于条件表达式 expression 求值的情况。 表达式是由下面 CONDITIONALEXPRESSIONS条件表达式 章节中描述的原语(primaries) 组成。 [[]] 中的词不会进行词的拆分和路径的扩展处理; 而tilde 扩展,参数和变量扩展,算术扩展,命令替换,函数替换和引用的去除则都将进行。

当使用 ==!= 操作符时,操作符右边的字符串被认为是一个模式,根据下面 Pattern Matching(模式匹配) 章节中的规则进行匹配。 如果匹配则返回值是 0,否则返回 1。模式的任何部分可以被引用,强制使它作为一个字符串而被匹配。

表达式可以用下列操作符结合起来。根据优先级的降序列出如下:

( expression )

返回表达式 expression 的值。括号可以用来提升操作符的优先级。

! expression

返回真,如果表达式 expression 返回假。

expression1 && expression2

返回真,如果表达式 expression1expression2 都返回真。

expression1 || expression2 返回真,如果表达式 expression1 或者 expression2 二者之一返回真。

&&(与) 和 || 操作符不会对表达式 expression2 求值,如果 expression1 可以决定整个条件表达式的返回值的话。

for name [ in word ] ; do list ; done

in 之后的一系列词会被扩展,产生一个项目列表。变量 name 被依次赋以这个列表中的每个元素, 序列 list 每次都被执行。如果 in word 被忽略,那么 for 命令遍历 已设置的位置参数(positional parameter,参见下面的 PARAMETERS 参数), 为每一个执行一次序列 list。 返回值是最后一个命令的返回值。如果 in 之后的词扩展的结果是空列表,就不会执行任何命令,返回值是 0。

for (( expr1 ; expr2 ; expr3 )) ; do list ; done

首先,算术表达式 expr1 被根据下面 算术求值(ARITHMETICEVALUATION)“ 中的规则进行求值。 然后算术表达式 expr2 被循环求值,直到它等于 0。每次 expr2 结果非零时,序列 list 都被执行, 算术表达式 expr3 被求值。如果任何表达式被忽略,将被视为执行结果是 1。 返回值是序列 list 中被执行的最后一个命令的返回值;或者是 false,如果任何表达式非法的话。

select name [ in word ] ; do list ; done

in 之后的一系列词会被扩展,产生一个项目列表。这个扩展后的词集合被输出到标准错误上,每个前面 加上一个数字。如果 in word 被忽略,将输出位置参数 (参见下面的 PARAMETERS 参数 章节)。 PS3 提示符将被显示出来,等待从标准输入得到一行输入。如果 输入是一个数字且显示中有对应的词,那么变量 name 的值将设置为这个词。如果输入一个空行,那么词和提示符将再次显示出来。如果读入了一个 EOF,命令就结束。 任何其他值将设置变量 name 为空。读入的行保存为变量 REPLY. 序列 list 在每次选择之后都会执行,直到执行了一个 break 命令。 select 的退出状态是序列 list 中执行的最后一个命令的退出状态,如果没有执行命令就是 0。

case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac

case 命令首先扩展 word, 然后依次试着用每个 pattern 来匹配它, 使用与路径扩展相同的匹配规则(参见下面的 Pathname Expansion 路径扩展 章节)。如果找到一个匹配,相应的序列将被执行。找到一个匹配之后,不会再尝试其后的匹配。 如果没有模式可以匹配,返回值是 0。否则,返回序列中最后执行的命令的返回值。

if list; then list; [ elif list; then list; ] ... [ else list; ] fi

序列 if list 被执行。如果退出状态是 0,then list 将被执行。否则,每个 elif 将被一次执行,如果退出状态是 0,相应的 then list 将被执行,命令结束。 否则,else list 将被执行,如果存在的话。 退出状态是最后执行的命令的退出状态,或者是 0,如果所有条件都不满足。

while list; do list; done

until list; do list; done

while 命令不断地执行序列 do list,直到序列中最后一个命令返回 0。 until 命令和 while 命令等价,除了对条件的测试恰好相反;序列 do list 执行直到序列中最后一个命令返回非零状态值。 whileuntil 命令的退出状态是序列 do list 中最后一个命令的退出状态, 或者是 0,如果没有执行任何命令。

[ function ] name () { list; }

这样可以定义一个名为 name 的函数。函数体 body 是包含在 { 和 } 之间的命令序列 list。 在指定将 name 作为一个命令运行的场合,这个序列将被执行。 函数的退出状态是函数体最后执行的命令的退出状态(参见下面的 FUNCTIONS 函数 章节)。