case和select结构在技术上说并不是循环, 因为它们并不对可执行代码块进行迭代. 但是和循环相似的是, 它们也依靠在代码块顶部或底部的条件判断来决定程序的分支.
select
select结构是建立菜单的另一种工具, 这种结构是从ksh中引入的.
select variable [in list]
do
TT class="REPLACEABLE" >command...
break
done
提示用户输入选择的内容(比如放在变量列表中). 注意: select命令使用PS3
提示符, 默认为(#?), 当然, 这可以修改.
#!/bin/bash PS3='Choose your favorite vegetable: ' # 设置提示符字串. echo select vegetable in "beans" "carrots" "potatoes" "onions" "rutabagas" do echo echo "Your favorite veggie is $vegetable." echo "Yuck!" echo break # 如果这里没有 'break' 将不停循环进行选择 done exit 0
如果忽略了in list列表, 那么select命令将会使用传递到脚本的命令行参数($@
), 或者是函数参数(当select是在函数中时).
与忽略in list的
for variable [in list]
结构比较一下.
例: 使用函数中的select结构来创建菜单
#!/bin/bash PS3='Choose your favorite vegetable: ' echo choice_of() { select vegetable # [in list]被忽略, 所以'select'使用传递给函数的参数. do echo echo "Your favorite veggie is $vegetable." echo "Yuck!" echo break done } choice_of beans rice carrots radishes tomatoes spinach # $1 $2 $3 $4 $5 $6 # 传递给choice_of()的参数 exit 0
case (in) / esac
在shell中的case结构与C/C++中的switch结构是相同的. 它允许通过判断来选择代码块中多条路径中的一条. 它的作用和多个if/then/else语句的作用相同, 是它们的简化结构, 特别适用于创建菜单.
case "$variable" in
"$condition1" )
TT class="REPLACEABLE" >command...
;;
"$condition2" )
TT class="REPLACEABLE" >command...
;;
esac
例: 简单的字符串匹配
#!/bin/bash # match-string.sh: 简单的字符串匹配 match_string () { MATCH=0 NOMATCH=90 PARAMS=2 # 此函数需要2个参数. BAD_PARAMS=91 [ $# -eq $PARAMS ] || return $BAD_PARAMS case "$1" in "$2") return $MATCH;; * ) return $NOMATCH;; esac } a=one b=two c=three d=two match_string $a # 参数个数错误. echo $? # 91 match_string $a $b # 不匹配 echo $? # 90 match_string $b $d # 匹配 echo $? # 0 exit 0