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的最后一个命令的退出状态,或者,如果任何一个表达式是无效的,则返回值为假。
break和continue内建命令(见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返回一个非零的状态,elif依次执行每个elif,如果它的退出状态是零,则相应的more-consequents被执行,然后结束。如果存在‘else alternate-consequents’,并在最后一个if或者elif子句中的最后一个命令是非零的退出状态,则alternate-consequents被执行。返回状态是最后执行的命令的退出状态,或者如果没有条件是真时,返回状态是零。
case
case命令的语法是:
case word in [ [(] pattern [| pattern]…) command-list ;;]… esac
case会选择性地执行第一个匹配word的pattern所对应的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
如果expression1和expression2都是真,则结果为真。
expression1||expression2
如果expression1或expression2是真,则结果为真。
如果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
分享到:
相关推荐
Bash shell编程参考手册,Linux编程必备。
Bash参考手册.pdf
Bash参考手册(Linux Shell),简单的页面中,有BASH的基本用法,非常适合作为手册来参考。
高级bash shell手册 我见过的最好的bash shell 编程手册 推荐!
bash 手册bash 手册bash 手册bash 手册bash 手册bash 手册bash 手册bash 手册bash 手册
bash官方手册/Bash Reference Manual
BASH中文手册.pdfBASH中文手册.pdf
Bash中文手册,适合Linux shell入门级使用!
bash 入门经典 不可不看哦 bash 入门经典 不可不看哦 bash 入门经典 不可不看哦
linux shell教程,很不错,强烈推荐
bash学习手册 文字版 带目录,对于linuxer和运维工程师是不错的参考
这本使用大量的例子详细地介绍了Bash的语法,各种技巧,调试等等的技术,以循序渐进的学习方式,让你了解Bash的所有特性,在书中还有许多练习可以引导你思考,以得到更深入的知识。无论你是新手还是老手,或是使用...
linux平台的bash shell开发帮助文档(手册),英文版,版本4.2。日常开发shell翻阅, 章节如下: Definitions:: Some definitions used i n the rest of this manual. Basic Shell Features:: The shell "building ...
1.概述 (SYNOPSIS) ...3.描述 (DESCRIPTION) 4.选项 (OPTIONS) 5.参数 (ARGUMENTS) 6.启动 (INVOCATION) 7.定义 (DEFINITIONS) 8.保留字 ("RESERVED WORDS") 9.注释 (COMMENTS) 10.引用 (QOUTING) ...
鸟哥的BASH Shell编程手册
The GNU Bash Reference Manual, for Bash, Version 4.1
linux脚本bash官方手册,最官方的描述。
bash shell
译者序 <br>毫无疑问,UNIX/Linux最重要的软件之一就是shell,目前最流行的shell被称为Bash(Bourne Again Shell),几乎所有的Linux和绝大部分的UNIX都可以使用Bash。作为系统与用户之间的交互接口,shell几乎是你...
通过bash/shell生成jwt的脚本