Bash While 循环示例
bash while 循环是一个控制流语句,允许根据给定条件重复执行代码或命令。例如,运行 echo 命令 5 次或逐行读取文本文件或评估脚本命令行上传递的选项。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 终端 |
类别 | Linux shell 脚本 |
先决条件 | BASH 或 KSH |
操作系统兼容性 | *BSD • Linux • macOS • Unix • WSL |
预计阅读时间 | 5 分钟 |
bash while 循环语法
语法如下:
while [ condition ] do command1 command2 command3 done
command1 到 command3 将重复执行,直到条件为真。while 循环的参数可以是任何布尔表达式。当条件永远不会为假时,就会发生无限循环。以下是 while 循环的一行语法:
while [ condition ]; do commands; done while control-command; do COMMANDS; done
例如下面的 while 循环将在屏幕上打印 5 次欢迎:
#!/bin/bash x=1 while [ $x -le 5 ] do echo "Welcome $x times" x=$(( $x + 1 )) done
上面的代码是 bash 形式的单行代码:
x=1; while [ $x -le 5 ]; do echo "Welcome $x times" $(( x++ )); done
下面是使用 while 循环计算阶乘的示例 shell 代码:
#!/bin/bash counter=$1 factorial=1 # check if bash variable $counter set or not # see https://www.example.com/faq/see-check-if-bash-variable-defined-in-script-on-linux-unix-macos/ if [ -v $counter ] then echo "Syntax: $0 <number>" else while [ $counter -gt 0 ] do factorial=$(( factorial * counter )) counter=$(( counter - 1 )) done echo "$factorial" fi
$ chmod +x script.sh
$ ./script.sh 5
我的 Ubuntu Linux 桌面上运行的 while 循环
#!/bin/bash FILE="$1" # # Check for input file else die with an error/syntax # message if [ -v $FILE ] then echo "Syntax: $0 <filename>" exit 1 else # read $FILE using the file descriptors (FDs) exec 3<&0 exec 0<"$FILE" while read -r line do # use $line variable to process line echo "$line" done exec 0<&3 fi
您可以使用 while 循环轻松评估在脚本的命令行上传递的选项:
...... .. while getopts ae:f:hd:s:qx: option do case "${option}" in a) ALARM="TRUE";; e) ADMIN=${OPTARG};; d) DOMAIN=${OPTARG};; f) SERVERFILE=$OPTARG;; s) WHOIS_SERVER=$OPTARG;; q) QUIET="TRUE";; x) WARNDAYS=$OPTARG;; \?) usage exit 1;; esac done ....... ..
在一段时间循环中重定向用户输入
如何从文件中读取用户输入?假设您有一个包含各种 IP 地址的文件,如下所示。这是我使用cat 命令显示的文件:
$ cat bad-guys.ips.txt
破解者 IP 地址列表:
192.168.3.50#BLOCK:www-2 185.220.101.206#Block:hacker 91.192.103.26#Block:smptd hacker 46.19.141.85#Block:sending too many www requests
下面是一个 bash while 循环,将由内部字段分隔符 ( ) 分隔的 IP 地址读取$IFS到 octothorpe ( #) 中:
#!/bin/bash # Script name: block_ips.sh # Set the Internal Field Separator to an octothorpe '#' IFS='#' # Set input file name here INPUT="bad-guys.ips.txt" # Read file line-by-line to get an IP and comment to block it using the iptables while read -r ip comment do /sbin/iptables -A INPUT -s "$ip" -m comment --comment "$comment" -j DROP done < "$INPUT"
如何使用 while 作为无限循环?
可以使用空表达式创建无限 for while,例如:
#!/bin/bash while : do echo "infinite loops [ hit CTRL+C to stop]" done
使用 break 语句进行条件 while 循环退出
您可以使用 whil 循环内的 break 语句提前退出。您可以使用 break 从 WHILE 中退出。while 循环内的一般 break 语句如下:
while [ condition ] do statements1 #Executed as long as condition is true and/or, up to a disaster-condition if any. statements2 if (disaster-condition) then break #Abandon the while lopp. fi statements3 #While good and, no disaster-condition. done
在这个例子中,当用户输入 -1 时,break 语句将跳过 while 循环,否则它将继续添加两个数字:
#!/bin/bash while : do read -p "Enter two numnbers ( - 1 to quit ) : " a b if [ $a -eq -1 ] then break fi ans=$(( a + b )) echo "$ans" done
使用 continue语句提前继续
要恢复封闭 WHILE 循环的下一次迭代,请使用 continue 语句,如下所示:
while [ condition ] do statements1 #Executed as long as condition is true and/or, up to a disaster-condition if any. statements2 if (condition) then continue #Go to next iteration of I in the loop and skip statements3 fi statements3 done
推荐阅读
我们了解到,bash while 循环在条件为真时执行。请参阅以下资源
- 在我们的 bash shell 目录中查看所有示例 shell 脚本
- 我们的 Linux shell 脚本教程指南中的 Bash 循环
- 来自我们常见问题解答部分的Bash for 循环示例。
请使用开发人员 Unix/Linux/macOS 工作站上的 help 命令或 man 命令阅读以下手册页:
$ man bash
$ help while
$ help {
$ help break
$ help [
$ help continue