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

posted @ 2022-09-12 22:38  shigp1  阅读(3509)  评论(0)    收藏  举报