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  阅读(3480)  评论(0)    收藏  举报