Bash的for复合命令(compoundcommand)可以用来循环执行指定的语句。此命令有两种不同的格式。参见manbash中for命令的说明,说明如下。对于名称[[在[单词...]]中;]做清单;为名称[[在[word...]]中完成;]做清单;done后面的单词列表被展开,生成一个项目列表。依次为这个列表的每个元素设置变量名,每次执行list。如果省略in字,则for命令会为每个设置的位置参数执行一次列表。返回状态是执行的最后一个命令的退出状态。如果in后面的item展开结果是一个空列表,则不执行任何命令,返回状态为0。这种格式的for命令先展开word列表得到一个数组,然后把name变量赋值依次对单词list的每个元素赋值,每次赋值都执行list指定的语句。如果没有提供单词列表,则遍历传递的脚本,或传递函数的参数列表。假设有一个testfor_each.sh脚本,内容如下:#!/bin/bashforwordinThisisasampleof"for.";做echo-n"$word"|tra-zA-Zdoneechofor参数;做echo-n"$param"|trA-Za-zdoneecho这个脚本首先使用for命令遍历字符串Thisisasampleof"for."的每个单词,然后打印单词内容,使用tr命令将小写字母转换为大写字母。之后在执行脚本时继续使用for命令遍历参数列表,打印参数值,将大写字母转换为小写字母。forparam语句不提供inword参数,默认会遍历传入脚本的位置参数。执行testfor_each.sh脚本,结果如??下:$./testfor_each.shTEST\"FOR\"COMMANDWITHPOSITIONALPARAMETERTHISISASAMPLEOFFOR.test"for"commandwithpositionalparameter有一个需要注意的地方对于这个执行结果,在Thisisasampleof"for."中。在这个字符串中,对于。用双引号括起来,但打印结果不包括双引号。这是因为bash在解析时会去掉双引号。这里的双引号并不是字符串本身的内容,而是用来将双引号内的字符串作为一个整体来限定的。如果要打印出双引号,需要使用\"进行转义,比如上面的\"FOR\",打印结果中包含双引号。对于((expr1;expr2;expr3));做清单;donefor((expr1;expr2;expr3));做清单;done首先,算术表达式expr1根据下面算术求值中描述的规则求值。然后重复计算expr2,直到它的计算结果为零。每次expr2的计算结果为非零值时,都会执行list并计算算术表达式expr3。如果省略任何表达式,它的行为就好像它的计算结果为1。返回值是列表中执行的最后一个命令的退出状态,如果任何表达式无效则返回false。注意:在这种格式的for命令中,expr1、expr2、expr3都是算术表达式。bash算术表达式的写法,具体写法请参考“ARITHMETICEVALUATION”一节和manbash中“((expression))”表达式的说明。假设有一个testfor_expr.sh脚本,内容如下:#!/bin/bashdeclarecountdeclarecount_strMAX=10for((i=0;i
