3.6 文件数据的循环与控制循环

         通常需要迭代存储在文件内部的项:使用嵌套循环、更改环境变量IFS。通过更改环境变量IFS,可以迫使for命令将文件中的每行作为单独的一项来处理,即使数据包含空格。提取了文件中的个别行之后,可能还必须再循环以提取包含的数据。

         循环开始之后就不得不继续循环直到它完成所有的迭代。其实不然,有两条命令可以帮助控制循环内部发送的事情:break命令、continue命令

3.6.1 文件数据的循环

         该脚本使用两个不同的IFS值解析数据。第一个IFS值解析文件/etc/passwd中的单独行。这个问题的典型示例是在/etc/passwd文件中处理数据。这就需要逐行迭代文件/etc/passwd,然后将变量IFS的值更改为冒号,以便能将每行中的单个组成部分分离出来。        

#!/bin/bash
#文件数据的循环:使用嵌套循环,更改环境变量IFS。
IFS.OLD=$IFS
IFS=$'\n'
for entry in `cat /etc/passwd`
do
echo "Values in $entry -"
IFS=:
for value in $entry
do
echo " $value"
done
done

第3章 shell结构化命令------------(文件数据的循环与控制循环)_迭代

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 10
do
if [ $n -eq 5 ]
then
break
fi
echo "迭代数:"$n
done
echo "for循环完成!"

var=1
while [ $var -lt 10 ]
do
if [ $n -eq 5 ]
then
break
fi
echo "迭代数:"$n
done
echo "while循环完成!"

第3章 shell结构化命令------------(文件数据的循环与控制循环)_shell的continue命令_02

         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
done
done

第3章 shell结构化命令------------(文件数据的循环与控制循环)_shell脚本中输出和管道命令_03

         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
done
done

第3章 shell结构化命令------------(文件数据的循环与控制循环)_shell的break命令_04 

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的迭代数字:"$var1
done
#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
done
done
#continue与while命令操作实例
var1=0
while echo "while 迭代次数:$var1"
[ $var1 -lt 3 ]
do
if [ $var1 -gt 1 ] && [ $var1 -lt 3 ]
then
continue
fi
echo "内部迭代次数:"$var1
var1=$[ $var1 + 1 ]
done

第3章 shell结构化命令------------(文件数据的循环与控制循环)_shell脚本中输出和管道命令_05

         可以在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的迭代数字:"$var1
done | 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
done
done >continue.txt

第3章 shell结构化命令------------(文件数据的循环与控制循环)_shell的break命令_06