Bash 提供三种循环语法for
、while
和until
。
while
循环有一个判断条件,只要符合条件,就不断循环执行指定的语句。
1 | while condition |
注意:
do
和while
写在同一行时,需要分号分隔。写成两行时不需要分号。while
结构也可以写成单行:while true; do echo 'Hi, while looping ...'; done
while
的条件部分可以是执行一个命令,根据命令的返回值作为判断条件。while
的条件部分也可以执行任意数量的命令,但是执行结果的真伪只看最后一个命令的执行结果。condition
可以使用test
命令,跟if
结构的判断条件写法一致。until
循环与while
循环恰好相反,只要判断条件为失败,就循环执行指定的语句,直到条件成立(判断为真)。
1 | until condition |
注意:
do
与until
写在同一行时,需要分号分隔。写成两行时不需要分号。until
的条件部分也可以是一个命令,表示在这个命令执行成功之前,不断重复尝试。until
用得比较少,until
循环都可以转为while
循环,完全可以统一都使用while
。比如下面的例子。until
循环转为while
循环:
1
2
3
4 until cp $1 $2; do
echo 'Attempt to copy failed. waiting...'
sleep 5
done
1
2
3
4 while ! cp $1 $2; do
echo 'Attempt to copy failed. waiting...'
sleep 5
done
for...in
循环用于遍历列表的每一项。
1 | for variable in list |
for
循环会依次从list
列表中取出一项,作为变量variable
,然后在循环体中进行处理。
注意:
关键字for
与do
写在同一行时,需要分号分隔。写成两行时不需要分号。
list
有多种形式,以下是一些例子
for i in word1 word2 word3; # 给出多个值作为列表
1
2
3
- ```sh
for i in *.png; # 由通配符产生,查看当前目录下的所有png文件
for i in $(cat ~/.bash_profile); # 由子命令产生
1
2
3
- ```sh
for filename in "$@" ; # 读取脚本的所有参数,可以直接简写为`for filename;`,但是可读性不好。
for in in {1..10..2}; # 使用{start..end..step}扩展语法生成一个序列
1
2
3
4
5
6
7
8
9
10
## for 循环
`for`循环还支持 C 语言的循环语法。
```sh
for (( expression1; expression2; expression3 ))
do
commands
done
expression1
用来初始化循环条件,expression2
用来决定循环结束的条件,expression3
在每次循环迭代的末尾执行,用于更新值。
它等同于下面的while
循环:
1 | (( expression1 )) |
注意:
循环条件放在双重圆括号之中。
圆括号之中使用变量,不必加上美元符号$
。
for
条件部分的三个语句,都可以省略。比如下面的例子:
1 | # 脚本会反复读取命令行输入,直到用户输入了一个点(`.`)为止,才会跳出循环。 |
Bash 提供了两个内部命令break
和continue
,用来在循环内部跳出循环。
break
break
命令立即终止循环,程序继续执行循环块之后的语句,即不再执行剩下的循环。
1 |
|
continue
continue
命令立即终止本轮循环,开始执行下一轮循环。
1 |
|
select
结构主要用来生成简单的菜单。它的语法与for...in
循环基本一致。
select
生成一个菜单,内容是列表list
的每一项,并且每一项前面还有一个数字编号。Bash 提示用户选择一项,输入它的编号。用户输入以后,Bash 会将该项的内容存在变量name
,该项的编号存入环境变量REPLY
,执行命令体commands
。如果用户没有输入,就按回车键,Bash 会重新输出菜单,让用户选择。执行结束后,回到第一步,重复这个过程。
1 | select name in list |
select
可以与case
结合,针对不同项,执行不同的命令。下面是一个例子:
1 |
|