select與case:bash
格式:ide
select variable in list函數
doui
循環體命令spa
donerest
例1:input
#!/bin/bashit
PS3="what do you want: "class
select i in a b c d #在例2中省略的部分test
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
練習:
一、寫一個服務腳本/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)
exit
;;
*)
echo "you input is worry"
esac
done