流程控制
程序若只能顺序逐句执行,则有些功能会无法完成。故必须有特定的流程控制语句,可
以让使用者控制程序的执行流程。Bash 提供通常三类流程控制语句,分别为:条件、循环
和分支
1:多分支条件
#!/bin/bash
if [ "$1" -eq 1 ]; then
echo "1"
elif [ "$1" -eq 2 -o "$1" -eq 3 ]; then
echo "2 or 3"
elif [ "$1" -ge 4 -a "$1" -lt 7 ]; then
echo "[4, 7)"
else
echo "others"
fi
2. 循环
Bash 中支持三种不同类型的循环:for 循环、while 循环和 until 循环,无论何种形式,
循环体中的语句都包含在 do-done 语句之间。
1)list 是一个字符串的列表,由空白字符分隔。list 支持通配符,也可以缺省,如果 list 缺
省,for 循环则自动使用当前的参数列表($@ 变量)来作为 list。
如程序清单所示的代码,根据输入参数,分别循环打印工作日和非工作日。
程序清单 for 循环基本应用示例脚本
#!/bin/bash
if [ "$1" == "weekdays" ]; then
for wd in Monday Tuesday Wednesday Thursday Friday; do
echo $wd
done
elif [ "$1" == "weekend" ]; then
for wd in Saturday Sunday
do
echo $wd
done
else
echo "Wrong input!"
fi
C风格 for 循环脚本
#!/bin/bash
for ((i=0; i < 7; i++))
do
echo $i
done
2)while 循环
while 循环是测试一个条件,并反复执行循环体到条件为假时结束,也有 Shell 风格和 C
风格两种形式。
while 循环示例脚本
#!/bin/bash
i=0
while [ "$i" -le "$#" ]
do
eval tmp=\$$i
# 以变量 i 的值为变量名再取值
echo "$tmp"
i=`expr $i + 1`
done
echo
j=0
while ((j++ <= i))
do
eval tmp=\$$j
echo "$tmp"
done
3)until 循环
until 循环与 while 结构类似,但 util 循环的语义是条件为假时反复执行循环体到条件变
为真时结束
until [条件]
do
命令
done
或者
until ((表达式))
do
命令
done
5)break 和 continue
所有的 Shell 循环结构,都可以使用 break 或者 continue 跳出循环,语义与 C 语言中相
同。不同的地方在于,break 或者 continue 都可以带一个数字指示跳出几重循环。缺省为 1。
如下所示的代码结构中的 break 和 continue,可以直接终止或重新执行多重循环。
for ((i=0; i<10; i++)); do
语句 1
for ((j=0; j < 10; j++)); do
for ((k=0; k < 10; k++)); do
if [ condition1 ]; then
continue 2
elif [ condition2 ]; then
break 2
else
break 3
fi
done
done
done
注:(())所支持的 C 风格循环的条件测试,脚本第一行的解释器必须是 bash ,只有较
新版本的 Bash 才支持这种风格。若使用 sh 做解释器,这种风格的循环会出错。
3. 分支
Shell 中的分支结构主要就是 case-esac 语句。该结构与 C 语言中的 switch-case 结构非常
类似。
case 结构示例脚本
#!/bin/bash
case "$1" in
"first")
echo "Parameter one is first"
;;
"second")
echo "Parameter one is second"
;;
"third")
echo "Parameter one is third"
;;
*)
echo "The parameter is not first, second or third"
;;
esac