bash while循环

时间:2020-03-05 15:31:41  来源:igfitidea点击:

循环是编程语言的基本概念之一。
当我们要多次运行一系列命令直到满足特定条件时,循环很方便。

在Bash等脚本语言中,循环对于自动执行重复性任务很有用。
Bash脚本中有三种基本的循环构造,即'for'循环,'while'循环和'until'循环。

本教程介绍了Bash中“ while”循环的基础。
我们还将向我们展示如何使用“ break”和“ continue”语句来改变循环流程。

bash“ while”循环

只要给定条件的值为真,“ while”循环就可以执行给定命令集的次数未知。

Bash的“ while”循环采用以下形式:

while [CONDITION]
do
  [COMMANDS]
done

“ while”语句以“ while”关键字开头,后跟条件表达式。

在执行命令之前先评估条件。
如果条件评估为真,则执行命令。
否则,如果条件评估为假,则循环终止,程序控制将传递给随后的命令。

在下面的示例中,在每次迭代中,将打印变量'i'的当前值并将其递增1.

i=0
while [ $i -le 2 ]
do
  echo Number: $i
  ((i++))
done

只要“ i”小于或者等于2,Tue循环就会迭代。
它将产生以下输出:

Number: 0
Number: 1
Number: 2

无限的“ while”循环

无限循环是无限重复且永不终止的循环。
如果条件始终为真,则将出现无限循环。

在下面的示例中,我们使用内置命令':'创建无限循环。
':'始终返回true。
我们还可以使用内置的“ true”或者任何其他始终返回true的语句。

while :
do
  echo "Press <CTRL+C> to exit."
  sleep 1
done

上面的“ while”循环将无限期运行。
我们可以通过按“ CTRL + C”来终止循环。

这是单行等效项:

while :; do echo 'Press <CTRL+C> to exit.'; sleep 1; done

逐行读取文件

“ while”循环最常见的用法之一是逐行读取文件,数据流或者变量。

这是一个示例,它逐行读取'/etc/passwd'文件并打印每一行:

file=/etc/passwd
while read -r line; do
  echo $line
done < "$file"

我们没有使用条件控制'while'循环,而是使用输入重定向('<“ $file”')将文件传递给控制循环的'read'命令。
“ while”循环将一直运行到读取最后一行为止。

逐行读取文件时,请始终将'read'与'-r'方法一起使用,以防止反斜杠充当转义符。

默认情况下,“读取”命令会修剪前导/尾随空格字符(空格和制表符)。
在“读取”之前使用“ IFS =”选项可防止此行为:

file=/etc/passwd
while IFS= read -r line; do
  echo $line
done < "$file"

“break”和“continue”语句

'break'和'continue'语句可用于控制while循环的执行。

“break”语句

“ break”语句终止当前循环,并将程序控制权传递给终止循环之后的命令。
当满足特定条件时,通常用于终止循环。

在以下示例中,一旦当前迭代项等于'2',循环的执行将被中断。

i=0
while [ $i -lt 5 ]
do
  echo "Number: $i"
  ((i++))
  if [[ "$i" == '2' ]]; then
    break
  fi
done
echo 'All Done!'
Number: 0
Number: 1
All Done!

“continue”语句

'continue'语句退出循环的当前迭代,并将程序控制传递给循环的下一个迭代。

在下面的代码中,一旦当前迭代的项目等于“ 2”,则“ continue”语句将使执行返回到循环的开始并继续下一次迭代。

i=0
while [ $i -lt 5 ]
do
  ((i++))
  if [[ "$i" == '2' ]]; then
    continue
  fi
  echo "Number: $i"
done
echo 'All Done!'
Number: 1
Number: 3
Number: 4
Number: 5
All Done!