一、case语句
case语句实现一种分支结构,语法如下:
case expr in #expr为表达式
parrern1) #若expr与pattern1匹配,注意括号
commands1 #执行语句块commands1
;; #跳出case结构
parrern2) #若expr与pattern2匹配,注意括号
commands2 #执行语句块commands2
;; #跳出case结构
'''' #可以有任意多个模式匹配块
*) #若expr与上面的模式都不匹配
commands #执行语句块commands
;;
esac #case语句必须以esac终止
说明:
1、表达式expr按照顺序匹配每个模式,一旦有一个模式匹配成功,则执行该模式后面所有命令,然后退出case.
2、如果expr没有找到匹配模式,则执行默认值“*)”后面的命令块(类似于if语句中的else块);“*)”块可以不出现。
3、所给的匹配模式“pattrer?"中可以含有通配符和逻辑或“|”,
4、除非特殊需要,否则每个命令块的最后必须有一个双分号";;",可以独占一行,或者放在语句块最后一个命令的后面。
举例:根据选择显示不同的信息
#!bin/bash #filename=what-lang-do-you-like.sh echo "What is your preferred scriptiong language" read -p "1)bash 2)perl 3)python 4)ruby:" lang case $lang in 1) echo "You secected bash" ;; 2) echo "You secected perl" ;; 3) echo "You secected python" ;; 4) echo "You secected ruby" ;; *) echo "i do not konw!" ;; esac
二、select语句
select语句实现一种菜单循环结构,其语法如下所示:
select variable in List #将列表中的每一个菜单项之前添加一个从1开始的序号依次呈现给用户
#显示环境变量PS3的值(其中存放了引导用户输入的提示信息),让用户选择菜单项
#用户选择的菜单序号存在变量RELAY中,对应的List菜单项内容存在variable变量中
do #用户选择了一个菜单项之后进入循环体
<commands> #执行语句块commands
done #本次循环结束,重新进入下一次菜单选择循环
说明:
1、List列表的菜单项间隔符由环境变量IFS决定
2、按数值循环排列的菜单项会显示到标准错误输出(默认为显示器)
3、用户之间按<Enter>键重新显示菜单
4、与for循环类似,省略in list时等价于 in "$%*'
5、select语句是个无限循环,通常要配合case语句处理不同的的选单及退出。可以按ctrl+c退出循环,也可以在循环内用break命令退出循环或用exit命令终止脚本执行。
使用举例1,在select循环内根据菜单项的内容处理菜单
#!/bin/bash #filename=what-lang-do-you-like_menu_select.sh clear PS3="What is your preferred scripting language?" select s in bash perl python ruby '(quit)' do case $s in bash|perl|python|ruby) echo "You selected $s.";; '(quit)') break ;; *) echo "You selected error,retry..." ;; esac done
执行效果如下:
使用举例2,在select循环体内根据菜单项序号处理菜单。
#!/bin/bash #filename=what-vpn-do-you-want.sh clear PS3="What ××× do you want?" IFS="|" vpn="IPsec ×××|SSL ×××|PPTP ×××|Quit" software="libreswan openvpn pptp" select type in $vpn do case $REPLY in 1|2|3) echo "You selected $type,please install\" $(echo $software|cut -d' ' -f $REPLY)\"." ;; *) exit ;; esac done
使用效果如下