在 Bash 脚本中使用“while”循环来迭代命令。
Bash (Bourne Again Shell) 是 GNU/Linux 操作系统中的 shell 命令提示符和脚本语言。它是大多数 Linux 发行版的默认 shell。
像大多数脚本语言一样,Bash 提供循环语法来多次重复类似的任务。在本文中,我们将学习如何使用 尽管
在 Bash 中循环。
介绍
这 尽管
Bash 中的循环用于根据另一个命令(条件命令)的输出多次执行命令(已执行的命令)。执行的命令将继续运行,直到条件命令成功运行(即返回 0 状态。Linux 中的任何命令返回 0 表示成功,非零整数表示失败)。
如果有多个条件命令,则语句只考虑列表中最后一个命令的状态,即循环执行,直到列表中最后一个命令运行成功。
一般语法
的一般语法 尽管
Bash 中的循环是:
完成时
执行命令列表将继续运行,直到条件命令列表中的最后一个命令成功运行并以状态 0 退出。在迭代中,当最后一个条件命令失败时,循环退出。
用户可以在命令列表中指定任何可执行文件。它可以是标准 Linux 程序或自定义用户程序或脚本。每个命令都应该在一个新行上或在同一行上用分号分隔。
让我们看几个例子。
循环直到变量具有特定值: 以下循环执行直到变量的值 X
不等于 10。
x=0 而 [[ $x -ne 10 ]] 做 echo $x ((x++)) done
在每次迭代中,我们都会检查 x 的值是否为 10。正在使用 测试
命令。 [[ 表达 ]]
是测试命令的语法(见 男子测试
)。在这里,因为我们正在使用 -ne
运算符(代表“不等于”),如果 x 的值不为 10,则测试命令返回 0,即成功,如果 x 的值为 10,则返回非零值,即失败。
然后在里面 做...完成
块,我们打印 x 的值并增加它。一旦 x 的值为 10,测试命令将返回非零状态,并退出循环。
笔记: 在 while 循环中使用的索引变量将在 while 循环之前或在条件命令中初始化,这与 for 循环相反,它允许隐式初始化变量。
使用多个条件命令: 以下循环创建 5 个名为的目录 dir0, dir1, ... dir4
.
z=0 而 echo "文件列表:" ls -l [[ $z -ne 5 ]] do echo "Creating dir$z..." mkdir dir$z ((z++)) done
第一条命令 echo "文件列表:"
和 ls -l
将完全执行一次;它们的成功或失败对循环运行的时间没有任何影响。
然后将执行用于检查变量 z 值的测试命令。直到 z 的值不为 5,测试命令返回成功状态,因此循环继续运行。条件命令和执行的命令保持按顺序运行。在这里,对于每次迭代,它将首先在条件下运行 echo 命令和 ls 命令,然后第三个条件命令检查 z 的值。如果不是 5,则进入循环并执行给定的命令。
中断并继续
有条件退出的 Break 语句
我们也可以使用条件语句 如果
循环内。这 如果
语句可以与 休息
语句,用于有条件地退出循环。
x=0 while [[ $x -ne 10 ]] do if [[ $x -eq 5 ]] break fi echo $x ((x++)) done
上面的while循环会打印0到4的数字,然后当i的值为5时,就会跳出循环。当命令给出特定输出时要退出循环时,这特别有用。
有条件地跳过迭代的继续语句
Bash 也有一个 继续
语句,如果满足特定条件,则跳过循环中迭代的剩余部分。
x=0 while [[ $x -ne 10 ]] do if [[ $x -eq 5 ]] continue fi echo $x ((x++)) done
上面的循环将打印从 0 到 10 的数字,除了 5,因为在迭代过程中 x=5
有一个 continue 语句,它将在迭代开始时跳过循环中的其余代码 x=6
.
使用循环:脚本和命令行
循环语法可以直接在 Bash shell 中使用,也可以从可执行的 shell 脚本文件中使用。如同 为了
和 尽管
循环,一次 尽管
在 shell 上输入 loop 语法,shell 会继续提示让用户继续执行要循环的命令。
否则,用户可以将其保存在脚本文件中并执行该脚本文件。
这 #!/bin/bash
在开始指定执行文件时要使用的解释器。尽管 Bash 是当今最常用的 shell,但有些用户确实更喜欢 shell,例如 zsh
,应该在此文件的开头指定它来代替 bash。
授予执行权限 对于这个文件,运行:
chmod +x 测试.sh
最后, 执行文件, 跑:
./test.sh
结论
这 尽管
循环,类似于 为了
和 直到
循环是 Bash 脚本中的一个重要特性。 While 循环与直到循环的用途类似,不同之处在于它用于在特定程序成功时运行备用命令/程序。这通常在高级网络脚本、系统维护脚本等中很有用。