一、循环嵌套1、在for循环中嵌套另一个for循环
[root@t1 ~]# cat t36.sh
#!/bin/bash
for (( i=1; i<=3; i++ ))
do
echo "out loop $i"
for (( j=1; j<=2; j++ ))
do
echo "inside loop $j"
done
done
[root@t1 ~]# ./t36.sh
out loop 1
inside loop 1
inside loop 2
out loop 2
inside loop 1
inside loop 2
out loop 3
inside loop 1
inside loop 2
2、将for循环放在while内
[root@t1 ~]# cat t37.sh
#!/bin/bash
var1=3
while [ $var1 -gt 0 ]
do
echo "out loop $var1"
var1=$[ $var1-1 ]
for (( i=3; i>0; i--))
do
echo "inside loop $i"
done
done
[root@t1 ~]# ./t37.sh
out loop 3
inside loop 3
inside loop 2
inside loop 1
out loop 2
inside loop 3
inside loop 2
inside loop 1
out loop 1
inside loop 3
inside loop 2
inside loop 1
3、until与while结合
[root@t1 ~]# cat t38.sh
#!/bin/bash
var1=4
until [ $var1 -eq 2 ]
do
echo "out until loop $var1"
var1=$[ $var1 -1 ]
var2=3
while [ $var2 -lt 5 ]
do
echo "inside loop $var2"
var2=$[ $var2 + 1 ]
done
done
[root@t1 ~]# ./t38.sh
out until loop 4
inside loop 3
inside loop 4
out until loop 3
inside loop 3
inside loop 4
二、文件数据的循环
有时需要迭代存储在文件内部的项,这需要两种技术的结合
*使用循环嵌套
*更改环境边玲IFS
[root@t1 ~]# cat t39.sh
#!/bin/bash
#changing the IFS value
IFSOLD=$IFS
IFS=$'\n'
for entry in `cat /etc/passwd`
do
echo "values in $entry -"
IFS=:
for value in $entry
do
echo "$value"
done
done
[root@t1 ~]# ./t39.sh
values in root:x:0:0:root:/root:/bin/bash -
root
x
0
0
root
/root
/bin/bash
values in bin:x:1:1:bin:/bin:/sbin/nologin -
bin
x
1
1
bin
/bin
/sbin/nologin
三、循环控制
有两条命令可以终止循环迭代:break、continue
1、使用break命令跳出循环
1、1跳出单循环
[root@t1 ~]# cat t41.sh ---跳出单循环
#!/bin/bash
#breaking out of a for loop
for var1 in 1 2 3 4 5 6 7 8 9 10
do
if [ $var1 -eq 5 ]
then
break
fi
echo "Iteration number:$var1"
done
echo "the for loop is completed"
[root@t1 ~]# ./t41.sh
Iteration number:1
Iteration number:2
Iteration number:3
Iteration number:4
the for loop is completed
[root@t1 ~]# cat t42.sh ---break out while loop
#!/bin/bash
#breaking out a while loop
var1=10
while [ $var1 -gt 1 ]
do
if [ $var1 -eq 5 ]
then
break
fi
echo "eteration : $var1"
var1=$[ $var1 - 1 ]
done
echo "the while loop is completed"
[root@t1 ~]# ./t42.sh
eteration : 10
eteration : 9
eteration : 8
eteration : 7
eteration : 6
the while loop is completed
1、2跳出内循环
[root@t1 ~]# cat t43.sh
#!/bin/bash
#break out inner loop
for (( a=1; a<5; a++ ))
do
echo "Outer loop:$a"
for (( b=1; b<5; b++ ))
do
if [ $b -eq 3 ]
then
break
fi
echo "inner loop:$b"
done
done
[root@t1 ~]# ./t43.sh
Outer loop:1
inner loop:1
inner loop:2
Outer loop:2
inner loop:1
inner loop:2
Outer loop:3
inner loop:1
inner loop:2
Outer loop:4
inner loop:1
inner loop:2
1、3跳出外循环
#!/bin/bash
for (( i=10; i>0; i-- ))
do
echo "outer loop:$i"
for (( j=10; j>0; j-- ))
do
if [ $j -eq 8 ]
then
break 2
fi
echo "inner loop:$j"
done
done
[root@t1 ~]# ./t45.sh
outer loop:10
inner loop:10
inner loop:9
2、continue命令
continue命令是一种提前停止循环内命令,而不完全终止循环的方法。这就允许在循环中设置shell不执行命令的条件。[root@t1 ~]# cat t46.sh
#!/bin/bash
#using continue
for (( i=1; i<10; i++ ))
do
if [ $i -gt 3 ] && [ $i -lt 8 ]
then
continue
fi
echo "the number is:$i"
done
[root@t1 ~]# ./t46.sh
the number is:1
the number is:2
the number is:3
the number is:8
the number is:9
使用continue命令停止外循环
[root@t1 ~]# cat t49.sh
#!/bin/bash
#continuing an outer loop
for (( a=1; a<=5; a++ ))
do
echo "iteration $a:"
for (( b=1; b<3; b++ ))
do
if [ $a -gt 2 ] && [ $a -lt 4 ]
then
continue 2
fi
var3=$[ $a * $b ]
echo "the result of $a * $b is $var3"
done
done
[root@t1 ~]# ./t49.sh
iteration 1:
the result of 1 * 1 is 1
the result of 1 * 2 is 2
iteration 2:
the result of 2 * 1 is 2
the result of 2 * 2 is 4
iteration 3:
iteration 4:
the result of 4 * 1 is 4
the result of 4 * 2 is 8
iteration 5:
the result of 5 * 1 is 5
the result of 5 * 2 is 10
四、处理循环的输出
[root@t1 ~]# cat t50.sh
#!/bin/bash
for file in /root/*
do
if [ -d $file ]
then
echo "$file is a directory"
else
echo "$file is a file"
fi
done > output.txt ---将结果重定向到output.txt文件,不输出到屏幕
[root@t1 ~]# more output.txt
/root/5 is a file
/root/anaconda-ks.cfg is a file
/root/Desktop is a directory
/root/install.log is a file
/root/install.log.syslog is a file
/root/l is a file
/root/output.txt is a file
/root/readline-5.0 is a directory
/root/rlwrap-0.37 is a directory
/root/states is a file
/root/t13.sh is a file
/root/t14.sh is a file
/root/t15.sh is a file
/root/t16.sh is a file
/root/t17.sh is a file
/root/t18.sh is a file
[root@t1 ~]# cat t51.sh ---对输出的结果进行了排序处理
#!/bin/bash
#piping a loop to another command
for state in "North Dakota" Connecticut Illinois Tennessee
do
echo "$state is the next place to go"
done|sort
echo "this completes our travels"
[root@t1 ~]# ./t51.sh
Connecticut is the next place to go
Illinois is the next place to go
North Dakota is the next place to go
Tennessee is the next place to go
this completes our travels