3.6 文件数据的循环与控制循环 通常需要迭代存储在文件内部的项:使用嵌套循环、更改环境变量IFS。通过更改环境变量IFS,可以迫使for命令将文件中的每行作为单独的一项来处理,即使数据包含空格。提
3.6 文件数据的循环与控制循环
通常需要迭代存储在文件内部的项:使用嵌套循环、更改环境变量IFS。通过更改环境变量IFS,可以迫使for命令将文件中的每行作为单独的一项来处理,即使数据包含空格。提取了文件中的个别行之后,可能还必须再循环以提取包含的数据。
循环开始之后就不得不继续循环直到它完成所有的迭代。其实不然,有两条命令可以帮助控制循环内部发送的事情:break命令、continue命令。
3.6.1 文件数据的循环
该脚本使用两个不同的IFS值解析数据。第一个IFS值解析文件/etc/passwd中的单独行。这个问题的典型示例是在/etc/passwd文件中处理数据。这就需要逐行迭代文件/etc/passwd,然后将变量IFS的值更改为冒号,以便能将每行中的单个组成部分分离出来。
#!/bin/bash#文件数据的循环:使用嵌套循环,更改环境变量IFS。IFS.OLD=$IFSIFS=$'/n'for entry in `cat /etc/passwd`do echo "Values in $entry -" IFS=: for value in $entry do echo " $value" donedone

3.6.2 break命令
break命令是在处理过程中跳出循环的一种简单方法。可以使用break命令退出任何类型的循环,包括while循环和until循环。
1.跳出单循环
shell执行break命令时,它试图跳出当前正在处理的循环。for循环通常迭代列表中指定的所有值,当if-then条件满足时,shell执行break命令,终止for循环。
#!/bin/bash#跳出单循环for n in 1 2 3 4 5 6 7 8 9 10do if [ $n -eq 5 ] then break fi echo "迭代数:"$ndoneecho "for循环完成!"var=1while [ $var -lt 10 ]do if [ $n -eq 5 ] then break fi echo "迭代数:"$ndoneecho "while循环完成!"

2.跳出内循环
使用多循环时break命令自动终止所在的最里面的内部循环。内循环的for语句规定迭代到变量b的值等于100。内循环的if-then语句指定变量b的值等于5时,执行break命令。注意,即使内循环被break命令终止,外循环会继续按执行进行。
#!/bin/bash#跳出内循环for(( i=1;i<=4;i++ ))do echo "外循环:"$i for(( j=1;j<100;j++ )) do if [ $j -eq 5 ] then break fi echo " 内循环:"$j donedone

3.跳出外循环
有时处于内循环但需要停止外循环。break命令包括单独的命令行参数值:break n。n表明要跳出的循环级别。默认情况下,n是1,代表跳出当前循环。如果将n设置为2,break命令将停止外循环的下一级循环。
#!/bin/bash#跳出内循环for(( i=1;i<=4;i++ ))do echo "外循环:"$i for(( j=1;j<100;j++ )) do if [ $j -eq 5 ] then #跳出外循环 break 2 fi echo " 内循环:"$j donedone

3.6.3 continue命令
continue命令是一种提前停止循环内命令,而不完全终止循环的方法。这就允许在循环中设置shell不执行命令的条件。在while循环和until循环中可以使用continue命令,当shell执行continue命令时,它跳过余下的命令。
与使用break命令一样,continue命令也允许使用命令参数指定要继续的循环级别:continue n。其中,n定义了要继续的循环级别。使用continue命令停止处理循环内部的命令,但是继续外部循环。注意在脚本输出中,迭代的值为3时不处理任何内循环语句,因为continue命令停止了处理,但是继续外循环处理。
#!/bin/bash#continue与for命令操作实例for(( var1=1;var1<15;var1++ ))do if [ $var1 -gt 5 ] && [ $var1 -lt 10 ] then continue fi echo "for的迭代数字:"$var1done#continue -n命令操作实例for(( var1=1;var1<=5;var1++ ))do echo "迭代次数:$var1" for (( b=1;b<3;b++ )) do if [ $var1 -gt 2 ] && [ $var1 -lt 4 ] then continue 2 fi var3=$[ $var1*$b ] echo "$var1*$b="$var3 donedone#continue与while命令操作实例var1=0while echo "while 迭代次数:$var1" [ $var1 -lt 3 ]do if [ $var1 -gt 1 ] && [ $var1 -lt 3 ] then continue fi echo "内部迭代次数:"$var1 var1=$[ $var1 + 1 ]done

可以在shell脚本中使用管道或者重定向循环输出结果。可以通过在done命令的末尾添加处理命令来做到这一点。
#!/bin/bash#continue与for命令操作实例for(( var1=1;var1<15;var1++ ))do if [ $var1 -gt 5 ] && [ $var1 -lt 10 ] then continue fi echo "for的迭代数字:"$var1done | sort -r#continue -n命令操作实例for(( var1=1;var1<=5;var1++ ))do echo "迭代次数:$var1" for (( b=1;b<3;b++ )) do if [ $var1 -gt 2 ] && [ $var1 -lt 4 ] then continue 2 fi var3=$[ $var1*$b ] echo "$var1*$b="$var3 donedone >continue.txt
