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
結果:
[root@localhost 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
結果:
[root@localhost 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
原創文章,作者:zebra930,如若轉載,請注明出處:http://www.www58058.com/38683