📜  Bash 脚本 – While 循环

📅  最后修改于: 2022-05-13 01:57:27.972000             🧑  作者: Mango

Bash 脚本 – While 循环

while 循环是一个语句,它遍历代码块,直到指定的条件被评估为真。当不知道条件在评估为真之前要评估多少次为假时,我们可以在我们的程序中使用此语句或循环。

BASH 中 while 循环的语法如下所示:

while [ condition ];
do
    # statements
    # commands
done  

如果条件为假,则执行 while 块内的命令,并在检查条件后再次迭代。此外,如果条件为真,则跳过 while 块内的语句并执行 while 块之后的语句。

while循环的例子如下:

#!/usr/bin/bash 

a=7
while [ $a -gt 4 ];
do
    echo $a
    ((a--))
done

echo "Out of the loop"

正如我们所看到的,循环被迭代直到条件为真。一旦变量 a 变为 4,条件被评估为真,循环跳过命令块并开始执行块之后的命令。

使用 while 循环读取文件

我们可以在 BASH 中使用 while 循环读取文件。通过将某些参数解析为 while 循环条件,我们可以逐行或按其他组(如字符或单词)遍历文件。

#!/usr/bin/bash 

file=temp.txt

while read -r line;
do
    echo $line
done < "$file"

我们使用命令 read 从文件中实际获取行或字符。读取命令与 -r 参数一起传递,如果出现 \ 则忽略字符的转义,因此将其解析为它。我们从 done 语句之后提到的文件中读取了一行。 read 命令从提到的文件中读取一行,当读取文件的最后一行时,while 循环结束(没有剩余的行可以读取)。

这就是我们在 BASH 中使用 while 循环读取文件内容的方法。

无限while循环

使用 while 循环语句创建无限循环。我们不需要在 while 循环中放置任何条件,因此循环会无限迭代。下面是一个无限while循环的例子:

#!/usr/bin/bash 

while :
do
  echo "An Infinite loop"
  # We can press Ctrl + C to exit the script
done

因此,脚本中的 while 循环将无限循环。我们可以通过 CTRL + C 手动中断循环或脚本。

While循环迭代固定次数

我们可以使用while循环来迭代固定次数,我们可以将条件设置为-le或小于等于一个数字,循环将一直迭代直到迭代器小于或等于提供的数字条件。此外,我们需要手动增加迭代器以保持循环迭代器滴答作响,否则循环将永远持续下去。

#!/usr/bin/bash 

i=1

# the number 4 can be the limit to 
# iterate the loop
while [ $i -le 4 ];
do
    echo $i
    ((i++))
done

在上面的示例中,我们可以看到循环迭代了定义的次数。由于我们已将计数器初始化为 1,并且条件是迭代循环,直到迭代器小于或等于本例中的数字 4。因此,我们可以根据我们的要求更改条件中的数字。

使用 getopts 选项读取命令行参数

我们可以使用 get ops 选项从命令行读取输入,如果有多个参数,我们可以检查它们并使用 while 循环一一解析。 getopts 是一个从命令行获取用户输入的工具,我们可以有多个选项从命令行解析,并且使用 getopts 和 while 循环,我们可以制作一个专业的用户输入程序。

#!/bin/bash

while getopts n:a: OPT
do
        case "${OPT}"
        in
           n) name=${OPTARG};;
           a) age=${OPTARG};;
           *) echo "Invalid option"
              exit 1;;
        esac
done

printf "My name is $name and am $age years old\n"

在这种情况下,我们有两个选项,即姓名和年龄,您可以有多个选项。我们需要指定使用 switch case 语句的选项,并在命令行中使用 -shorthand 选项。在这种情况下,我们使用-n 表示名称,使用-a 表示年龄。我们还有一个默认或无效的案例检查来忍受我们不解析错误的参数。我们可以使用OPTARG变量来分配选项的值,该变量解析提供给选项的值。

这里的 while 循环用于迭代直到没有从命令行传递的选项。我们检查 -n 和 -a 选项并迭代直到按下回车键或回车键并且没有其他选项要解析。

C 风格的 while 循环

我们可以在 BASH 中使用 C 风格的 while 循环,变量需要用 BASH 风格求值,但整体语法感觉像 C。我们可以在 while 循环的条件中使用 <,>,<= 等运算符因此它被称为 C 风格的 while 循环。

#!/bin/bash

i=0
while((i < 12))
do
   echo $i
   ((i+=2))
done

在这个例子中,我们可以看到 while 循环有一个带有非 bash运算符(如 -le、-ge 等)的条件,而我们在条件中使用了 C 风格的运算符。循环的其余部分是 BASH 中的基本循环,变量或迭代器 i 递增 2,正如我们在循环体的最后一条语句中看到的那样。因此循环迭代超过 5 次。

While循环对文件执行操作

我们可以对文件执行操作,例如只读取文件的特定部分。如果我们有以特定方式格式化的列,我们可以使用变量来分配它们并在一行数据时间内打印它们。

#!/bin/bash

while read a b c 
do
    echo $b - $a
done < wh.txt

在这个例子中,我们有三行,我们通过将它们分配给变量 a、b 和 c 来读取内容,它可以是您喜欢的任何内容,但请记住在循环体中使用它们。我们可以选择像 b 和 a 这样的特定列,并可以对它们进行打印或执行任何操作。这不会反映在文件中,因为它们只是本地脚本变量。

使用 while 循环写入文件

我们可以在 while 循环中通过用户输入写入文件。我们可以使用 while 循环进行迭代,直到我们使用 CTRL + D 通过保存对文件的更改或通过 CTRL + C 手动退出循环以避免写入文件。我们使用 read 命令从命令行输入文本并将其解析为文件。

#! /bin/bash

file=wh.txt
echo "Enter the content into the file $file"
while read line
do
    echo $line >> $file
done

因此,从上面的示例中,我们能够使用 while 循环和读取命令将文本输入文件。要退出循环并保存对文件的更改,我们使用 CTRL+D 键,而要退出循环而不将任何内容保存到文件中,我们可以使用 CTRL+C 键。因此,我们使用 read 命令和 while 循环将文本从命令行输入到文本文件中。

中断并继续

Break 和 continue 在处理循环语句的程序中是必不可少的,因为它们在没有任何显式条件的情况下控制循环语句的流程。

中断声明

我们使用 break 语句退出循环,而无需等待 while 循环的条件评估为真。该语句可以在循环块中使用。这可用于退出具有循环内编程条件的无限循环,从而保持对循环的控制。

例如,我们有一个从 1 开始一直计数的脚本。但是我们可以在循环体中使用带有条件的 break 语句以编程方式跳出循环。

#!/usr/bin/bash 

i=1
while :
do
    echo $i
    if [ $i -eq 20 ];
    then
        echo "This is end of the loop"
        break
    if
    ((i++))
done

从脚本和执行中,我们可以看到我们能够使用条件语句和 break 语句来中断或退出无限循环。因此,break 语句用于从 while 循环内部获取程序/脚本的控制流,以在循环条件评估为 true 的情况下跳出循环。

继续声明

我们可以使用 continue 语句来做与 break 语句相反的事情。它将跳转到循环块的开头并再次迭代。这可用于在某些条件下跳过某些命令,从而允许改变循环的流程。

例如,如果我们有一个初始化为 1 的变量,并且我们只想显示可被 5 整除的数字,或者在某个条件后以特定模式显示,我们可以使用 continue 语句来做到这一点。这允许以所需的方式迭代循环。

#!/usr/bin/bash 

i=1
while [ $i -lt 30 ];
do
    ((i++))
    if [[ $(( $i % 5 )) -ne 0 ]];
    then
        continue
    if
    echo $i
done

正如我们看到的 continue 语句,跳转到块的开头并通过跳过块内的下一个命令来开始执行命令。 while 循环只迭代变量 i的值小于 30,因此 if 条件检查变量 i是否可被 5 整除,如果不是,我们使用 continue 再次迭代并增加变量 i 的值。变量 i仅在它可被 5 整除时才被回显,因此 if 条件被评估为 false,并且我们不会遇到 continue 语句并使用循环的正常流程进行携带。这样做是为了避免记录每个数字,并且只打印不遵循 if 语句或其他条件语句中的模式或条件的数字。