Linux shell while循环,until循环,嵌套循环
一、while循环
while命令某种意义上是if-then语句和for循环的混杂体。while命令允许定义一个要测试的命令,然后循环执行一组命令,只要定义的测试命令返回的是退出状态码0。它会在每次迭代的一开始测试test命令。在test命令返回非零退出状态码时,while命令会停止执行那组命令。
格式:
while test command
do
other commands
done
例子:
#!/bin/bash
var=10
while [ $var -gt 0 ]
do
echo $var
var=$[$var - 1]
done

while命令允许你在while语句行定义多个测试命令。只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环。
#!/bin/bash
var=10
while echo $var
[ $var -gt 0 ]
do
echo This is inside loop
var=$[$var - 1]
done

#!/bin/bash
var=10
while echo $var [ $var -gt 0 ]
do
echo This is inside loop
var=$[$var - 1]
done

造成无限循环,因此用多个测试命令时,每个测试命令都出现在单独的一行上。
二、until循环
until命令和while命令工作的方式完全相反。until命令要求你指定一个通常返回非零退出状态码的测试命令。只有测试命令的退出状态码不为0 ,bash shell才会执行循环中列出的命令。一旦测试命令返回了退出状态码0 ,循环就结束了。
格式:
until test commands
do
other commands
done
例子:
#!/bin/bash
var=100
until [ $var -eq 0 ]
do
echo $var
var=$[$var-25]
done

#!/bin/bash
var=100
until echo $var
[ $var -eq 0 ]
do
echo This is inside loop
var=$[$var-25]
done

三、嵌套循环
#!/bin/bash
for((a=1;a<=3;a++))
do
echo start loop:$a
for ((b=1;b<=3;b++))
do
echo " inside loop:$b"
done
done

#!/bin/bash
var=5
while [ $var -ge 0 ]
do
echo out loop:$var
for((a=1;a<3;a++))
do
((result=var*a))
echo " $var * $a = $result"
done
var=$[$var-1]
done

#!/bin/bash
IFS_OLD=$IFS
IFS=$'\n'
for entry in $(cat /etc/passwd)
do
echo "entry:$entry"
IFS=:
for value in $entry
do
echo " $value"
done
done
IFS=$IFS_OLD

四、控制循环
break命令终止循环。
#!/bin/bash
for var in 1 2 3 4 5 6 7 8 9 10
do
if [ $var -eq 5 ]
then
break
fi
echo $var
done

#!/bin/bash
var=1
while [ $var -le 10 ]
do
if [ $var -eq 5 ]
then
break
fi
echo $var
var=$[$var+1]
done

#!/bin/bash
var=1
until [ $var -gt 10 ]
do
if [ $var -eq 5 ]
then
break
fi
echo $var
var=$[$var+1]
done

有多重循环时,break跳出内层循环。
#!/bin/bash
for((a=1;a<=3;a++))
do
echo start loop:$a
for ((b=1;b<=3;b++))
do
if [ $b -gt 2 ]
then
break
fi
echo " inside loop:$b"
done
done

#!/bin/bash
for((a=1;a<=3;a++))
do
if [ $a -gt 2 ]; then
break
fi
echo start loop:$a
for ((b=1;b<=3;b++))
do
echo " inside loop:$b"
done
done

有时你在内部循环,但需要停止外部循环。break 命令接受单个命令行参数值:
break n
其中 n 指定了要跳出的循环层级。默认情况下, n为1,表明跳出的是当前的循环。如果你将 n 设为2 ,break 命令就会停止下一级的外部循环。
#!/bin/bash
for((a=1;a<=3;a++))
do
echo start loop:$a
for ((b=1;b<=3;b++))
do
if [ $b -gt 2 ]
then
break 2
fi
echo " inside loop:$b"
done
done

continuet跳过后面的语句,进行下一轮循环。
#!/bin/bash
for((a=1;a<=3;a++))
do
echo start loop:$a
for ((b=1;b<=3;b++))
do
if [ $b -gt 2 ]
then
continue
fi
echo " inside loop:$b"
done
done

#!/bin/bash
for((a=1;a<=3;a++))
do
echo start loop:$a
for ((b=1;b<=3;b++))
do
if [ $b -gt 2 ]
then
continue 2
fi
echo " inside loop:$b"
done
done

#!/bin/bash
var=1
while [ $var -le 10 ]
do
if [ $var -eq 5 ]
then
continue
fi
echo $var
var=$[$var+1]
done

coninue导致跳过后面的更改循环变量,造成死循环。
五、处理循环输出
#!/bin/bash
file_name=$HOME/loop_output
for((a=1;a<=10;a++))
do
echo The loop:$a
done > $file_name
上面将循环输出重定向到文件。

#!/bin/bash
for((a=1;a<=10;a++))
do
echo The loop:$a
done | sort

例子:
#!/bin/bash
IFS=:
for file in $PATH
do
for f in $file/*
do
if [ -x $f ]; then
echo $f
fi
done
done

#!/bin/bash
input="/home/shi/user.csv"
while IFS=',' read -r userid name
do
echo "adding $userid"
useradd -c "$name" -m $userid
done < "$input"
批量导入用户。
user.csv

rich Richard Blum
christine Christine Bresnahan
barbara Barbara Blum
tim Timothy Bresnahan

浙公网安备 33010602011771号