shell 5

发表于:2007-06-08来源:作者:点击数: 标签:
shell编程之循环语句(2) 7.for语句 对列表的每一条目都进行一次循环过程,每完成一次循环过程就将var赋予列表中下一个条目,直到完成最后一个条目的循环为止 语法:???????????例子: forvarinlist????????$cattest_for do??????

shell编程之循环语句(2)

7.for语句

对列表的每一条目都进行一次循环过程,每完成一次循环过程就将var赋予列表中下一个条目,直到完成最后一个条目的循环为止

语法: ???????????例子:

for var in list????????$ cat test_for
do?????????????? for X in 1 2 3 4 5
???list A????????? do
done????????????? echo "2 * $X is \c"
??????????????? let X=X*2
??????????????? echo $X
??????????????? done

??????????????? $ test_for
??????????????? 2 * 1 is 2
??????????????? 2 * 2 is 4
??????????????? 2 * 3 is 6
??????????????? 2 * 4 is 8
??????????????? 2 * 5 is 10
 

 

在上例中,关键字为for,in,do和done,var代表一个shell变量的名字,这个变量的赋值会贯穿for循环的执行过程中,list是一串由空格或者tab分割开的字符串,在每一次循环执行都要将一个串赋值给var。

for循环的执行过程如下:

1.shell变量var被设置等于list中的第一个字符。

2.list A中的命令会被执行。

3.shell变量var被设置等于list中下一个字符。

4.list A中的命令被执行。

5.循环会持续执行,直到每一个list中的条目都执行过循环为止。

 

8.for循环的例子

例A:

$ cat example_A
for NAME in $(grep home /etc/passwd | cut -f1 -d
do
??mail $NAME < mtg.minutes
??echo mailed mtg.minutes to $NAME
done

 

例B

$ cat example_B
for FILE in *
do

?if
??test -d $FILE
?then
??ls -F $FILE

?fi

done
 

for结构是一种非常灵活的循环结构,它能够让循环贯穿任何能产生的列表。列表能很容易地用命令替代来产生,就像第一个例子中一样。使用管道和过滤器,能够从任何事产生一个列表。

如果你要求多次存取相同的列表,你也许想要将它存储到个文件中。你可以使用cat命令来为你的for循环产生列表,正如下例所示:

??$ cat students
??user1
??user2
??user3
??user4

??$ cat for_student_file_copy
??for NAME in $(cat_students)
??do
??cp test.file /home/$NAME
??chown $NAME /home/$NAME/test.file
??chmod g-w,o-w /home/$NAME/test.file
??echo done $NAME
??done

??$

存取命令行参数

你可以从命令行参数来产生list:

for i in $*?????????或者?????for i
do???????????????????? do?
??cp $i $HOME/backups????????????cp $i $HOME/backups
done ???????????????????done

 

9.break,continue,和exit命令

break [n] ?????中止循环过程的执行,并且跳到下一个命令。

continue [n]????停止循环过程的当前一个反复并且跳到循环中的下一个反复过程的开始部分

exit [n] ????? 停止shell程序的执行,并且将返回值设置为n。
 

在许多情况下,你可能需要在循环的正常中止条件满足之前放弃一个循环的执行。break和continue命令提供了一种无条件的流程控制。通常是在遇到一个错误的情况下来中止当前的循环继续执行。而exit命令用在不能从某种情况下恢复出来,而必须中止整个程序的运行的时候。

break命令会中止循环并且将控制权传递到done关键字后面的第一个命令。结果是完全跳出这个循环体而继续执行下面的命令。

continue命令有一点不同。当在程序执行过程中遇到这个命令,就会忽略本次循环中剩余的命令,而将控制权交给循环的顶部。这样,continue命令能让你仅仅中止循环过程中的一个反复但是继续从循环的顶部开始执行。

在while和until循环中,这种处理(continue)会导致在初始列表的开始部分继续执行,在for循环中,会将变量设置为列表中的下一个条目,然后继续执行循环。

exit命令停止执行当前的shell程序,并且根据提供的参数为这个shell程序设置一个返回值,如果没有提供返回值参数,当前的shell程序的返回值会被设置为在exit命令之前执行的命令的返回值。

注意:循环的流程控制在正常的情况下应当是通过设置循环开始部分的条件(while,until),或者是列表中的条目都循环完的(for),的情况来结束循环。而对循环过程进行中断操作仅仅应当在循环执行期间遇到没有规律的或者是错误的条件的时候才应当使用。

 

10.break和continue的例子

while
??true
do
??echo "Enter file to remove: \c"
 ??read FILE
??if test ! -f $FILE
??then
????echo $FILE is not a regular file
????continue
??fi
??echo removing $FILE
??rm $FILE
??break
done

 
 

这个例子显示break和continue命令的一次有效的使用。这个命令的执行是在while循环的test条件为真的情况下,会始终产生一个为真的结果;这意味着这个循环会是一个无限的循环,除非循环体中的某些命令能中止循环的运行(这就是bread命令需要做的)。如果输入的文件不是一个普通文件,一个错误信息会打印,同时continue命令会提醒用户再输入一次文件名。如果这个文件是个普通的文件,它会被删除,并且break命令被用来跳出这个无穷循环。

 

11.shell编程之循环-总结 

let expression ?????????????计算一个算术表达式

((expression)) ?????????????计算一个算术表达式

while condition is true do ...done??? while

until condition is true do ... done???until

for var in list do ... done ?????? for

break [n]????????????????break out of loop

continue [n]?????????????? 中止当前循环中的一次循环过程

exit [n]???????????????? 中止这个程序
 


 btq 回复于:2002-09-12 22:01:25
很好,希望常看到这样的文章

原文转自:http://www.ltesting.net