`
xitong
  • 浏览: 6176863 次
文章分类
社区版块
存档分类
最新评论

bash参考手册之三(基本的Shell特性)续二

 
阅读更多

3.2.4 复合命令

•循环结构:实现迭代的shell命令。
•条件结构:实现按条件执行的shell命令。
•命令组合:组合命令的方法。
复合命令是shell编程的结构件。每一个结构以一个保留字或控制操作符开始,并终止于相应的保留字或操作符。复合命令的重定向(见重定向)应用于该复合命令中的所有命令,除非明确覆盖。
Bash提供了循环结构,条件结构,和把命令组合起来作为一个单元执行的机制。

3.2.4.1 循环结构

Bash支持以下的循环结构。
注意,出现在语法描述的';',可以被替换为一个或多个换行。
until
until
命令的语法是:
until test-commands; do consequent-commands; done

执行consequent-commands,直到test-commands的退出状态是非0值。返回状态是consequent-commands的最后一条命令的退出状态,或者如果没有执行consequent-commands中的命令,则是零。

while
while
命令的语法是:
while test-commands; do consequent-commands; done

执行consequent-commands,直到test-commands的退出状态是0值。返回状态是consequent-commands的最后一条命令的退出状态,或者如果没有执行consequent-commands中的命令,则是零。

for
for
命令的语法是:
for name [ [in [words …] ] ; ] do commands; done

展开words,对于展开结果列表的每一个成员,执行一次commands,同时,name绑定到当前被展开的成员。如果不存在‘in words’,for命令对每个位置参数(见特殊参数)执行一次commands,就像指定了“in $@”。返回状态是执行的最后一个命令的退出状态。如果words展开后,没有内容的话,则commands不被执行,返回值是零。

另一种形式的for命令:
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done

首先,根据下述规则(见Shell运算)计算表达式expr1。然后计算表达式expr2,直到结果为零。每次expr2的计算结果为一个非零值时,执行commands,然后计算表达式expr3。如果任何表达式被省略,它的值相当于1。返回值是commands的最后一个命令的退出状态,或者,如果任何一个表达式是无效的,则返回值为假。

breakcontinue内建命令(见Bourne shell的内建命令)可以用来控制循环的执行。


3.2.4.2 条件结构

if

if命令的语法是:

if test-commands; then

consequent-commands;

[elif more-test-commands; then

more-consequents;]

[else alternate-consequents;]

fi

test-commands被执行,如果其返回值是零,则consequent-commands被执行。如果test-commands返回一个非零的状态,eli​​f依次执行每个elif,如果它的退出状态是零,则相应的more-consequents被执行,然后结束。如果存在‘else alternate-consequents’,并在最后一个if或者elif子句中的最后一个命令是非零的退出状态,则alternate-consequents被执行。返回状态是最后执行的命令的退出状态,或者如果没有条件是真时,返回状态是零。

case

case命令的语法是:

case word in [ [(] pattern [| pattern]…) command-list ;;]… esac

case会选择性地执行第一个匹配wordpattern所对应的command-list。如果shell选项nocasematch是打开的话(见shopt内建命令),匹配过程不考虑字符中的字母大小写。 '|'用于分隔多个pattern,“)”操作符用于终止一个pattern列表。pattern列表和相关的command-list被称为一个子句。

每个子句必须使用';;',';&',或';;&“终止。这个word在匹配之前要进行波浪线扩展,参数扩展,命令替换,算术扩展和移除引号等操作。每种pattern都要进行波浪线扩展,参数扩展,命令替换和算术扩展。

可以有任意数量的case子句,每个子句由“;;',';&',或';;&'终止。第一个相匹配的pattern确定了被执行的command-list

下面是一个例子,在脚本中使用case,可以用来描述动物的有趣的特性:

echo -n "Enter the name of an animal: "

read ANIMAL

echo -n "The $ANIMAL has "

case $ANIMAL in

horse | dog | cat) echo -n "four";;

man | kangaroo ) echo -n "two";;

*) echo -n "an unknown number of";;

esac

echo " legs."

如果使用操作符';;',在第一个pattern匹配后,不再尝试后续的匹配动作。使用';&'代替';;'导致继续执行下一个子句的command-list。使用';;&'代替';;',shell会测试后续子句的pattern,如果匹配,则执行相应的command-list

如果没有pattern能够匹配,则返回值是零。否则,返回值是被执行的command-list的退出状态。

select

select结构允许很容易地生成菜单。它具有和for命令几乎​​相同的语法:

select name [in words …]; do commands; done

in后面的words列表被扩展,形成项目清单。扩展后的words打印在标准错误输出流中,每个项目前面都有一个数字。如果省略‘in words’,则打印位置参数,如同指定了‘in "$@"’。 然后显示PS3提示,从标准输入中读取一行。如果该行内容和一个显示的内容前对应的数字匹配,然后name的值被设置到该内容。如果该行是空的,则再次显示项目内容和提示。如果读取到EOF,select命令完成。读到任何其他值会导致name被设置为null。读取的行的内容被保存在变量REPLY中。

每次选择后执行commands的命令,直到遇到break命令,此时select命令完成。

下面是一个例子,它允许用户从当前目录中选择一个文件名,并显示选定的文件名称和对应的顺序号。

select fname in *;

do

echo you picked $fname \($REPLY\)

break;

done

((…))
((expression))

根据下述规则(见Shell运算)的对expression求值。如果表达式的值是非零值,返回值是0,否则,返回值是1。完全等同于

let "expression"

见Bash内建命令,let内置命令的完整说明。


[[...]]
[[expression]]

返回状态0或1,取决于条件表达式expression的结果。表达式的组成见下述Bash中的条件表达式的内容。在'['和']'之间,单词分割和文件名扩展不执行;波浪线扩展,参数和变量扩展,算术扩展,命令替换,进程替换,和移除引号都执行。条件操作符'-f'必须去除引号,以被识别为运算符。

在'[['中使用'<'和'>'操作符时的排序词典使用当前区域设置。

当使用'=='和'!='运算符时,运算符右边的字符串被认为是一个模式,并根据下述的(见模式匹配)规则匹配。如果shell选项nocasematch(见shopt内建命令的shopt命令描述部分)被激活,匹配时不考虑字符大小写。如果字符串匹配(“==”)的或不匹配('!=')则返回值是0,否则为1。在模式的任何一部分,可以被引号包含,以强制它作为一个字符串匹配。

附加的二进制运算符'=〜',和'=='和'!='具有相同的优先级。当使用它时,操作符右边的字符串被认为是扩展正则表达式,按相应的匹配规则匹配(如regex3)。如果该字符串匹配,则返回值是0,否则为1。如果正则表达式的语法是不正确的,条件表达式的返回值是2。如果shell选项nocasematch(见shopt内建命令的shopt命令描述部分)被激活,匹配时不考虑字符大小写。在模式的任何一部分,可以被引号包含,以强制它作为一个字符串匹配。和正则表达式中的子表达式匹配的子字符串,被存储在数组变量BASH_REMATCH中。BASH_REMATCH中索引为0的元素,是匹配整个正则表达式的那部分字符串。BASH_REMATCH索引为n的元素,是字符串匹配的第n个子表达式的部分。

表达式可以结合使用下面的操作符,按从高到低的优先顺序列出:

expression

返回expression的值。这可用于覆盖正常的运算符优先级。

expression

如果expression是假的,则结果为真。

expression1&&expression2

如果expression1expression2都是真,则结果为真。

expression1||expression2

如果expression1expression2是真,则结果为真。

如果expression1的值足以决定整个条件表达式的返回值,则操作符 && 和 || 不计算expression2


3.2.4.3 分组命令

Bash提供两种组合方式,把一组命令列表组作为一个单元执行。命令被组合时,重定向施加到整个命令列表。例如,在列表中的所有命令的输出可能会被重定向到同一个数据流。
()

list

把一个命令列表放在括号中,导致系统创建一个子shell环境(见命令执行环境),每一个list中的命令都在该子shell中执行。由于list是在一个子shell中执行的,变量赋值不会保留到子shell完成后。

{}

{list;}

放在大括号中的命令列表中的命令,在当前shell环境中执行。不创建子shell。分号(或换行)是必需的。

除了是否创建子shell的区别,这两个结构之间的细微差异还有历史的原因,。大括号是保留字,所以他们必须通过空白或者其他分隔符号与list分开。小括号是操作符,即使它们和list之间不用空白分隔开,也被shell作为分隔符号。

这些结构的退出状态是list的退出状态。



原文链接:http://www.gnu.org/software/bash/manual/bash.html#Compound-Commands
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics