select与case:
格式:
select variable in list
do
循环体命令
done
例1:
#!/bin/bash
PS3="what do you want: "
select i in a b c d #在例2中省略的部分
do
case $i in
a)
echo aa
break #break是退出循环
;;
b)
echo bb
break
;;
c)
echo cc
break
;;
d)
echo dd
break
esac
done
结果:
[[email protected] bin]# ./select.sh
1) a
2) b
3) c
4) d
what do you want: 2
bb
select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入
用户输入菜单列表中的某个数字,执行相应的命令。
用户输入被保存在内置变量REPLY 中。
select 是个无限循环,因此要记住用break 命令退出循环,或用exit 命令终止脚本。也可以按ctrl+c 退出循环。
select 经常和case 联合使用。
与for 循环类似,可以省略in list ,此时使用位置参量。
return可以结束函数,此刻函数中的变量也被终止。
例1也可以写成例2的形式
例2
#!/bin/bash
PS3="what do you want: "
select i
do
case $i in
a)
echo aa
break
;;
b)
echo bb
break
;;
c)
echo cc
break
;;
d)
echo dd
break
esac
done
结果:
[[email protected] bin]# ./select1.sh a b c #与例1相比,这里需要写参数
1) a
2) b
3) c
what do you want: 3
cc
练习:
1、写一个服务脚本/root/bin/testsrv.sh,完成如下要求
(1) 脚本可接受参数:start, stop, restart, status
(2) 如果参数非此四者之一,提示使用格式后报错退出
(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
考虑:如果事先已经启动过一次,该如何处理?
(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
考虑:如果事先已然停止过了,该如何处理?
(5) 如是restart,则先stop, 再start
考虑:如果本来没有start,如何处理?
(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAMEis running...”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped...”
其中:SCRIPT_NAME为当前脚本名
#/bin/bash
read -p "which service :" name
basename=`basename $name`
dirname=`dirname $name`
start () {
if [ -f $name ] ; then
echo "$basename is running"
else
touch $name
echo "$basename starting success"
fi
}
stop () {
if [ -f $name ] ; then
rm -f $name
echo "$basename stopping"
else
echo "$basename does not work"
fi
}
restart() {
stop
start
}
status() {
if [ -f $name ] ; then
echo "$basename is running"
else
echo "$basename is stopped"
fi
}
PS3="you can choose num: "
select i in start restart stop status quit
do
case $i in
start)
start
# break
;;
stop)
stop
# break
;;
restart)
restart
# break
;;
status)
status
# break
;;
quit|q|Q)
exit
;;
esac
done