case語句實現流程控制
編寫一個菜單腳本(水果菜單目錄)
1. apple
2. Strawberry
3. Pear
4. Grape
選中不同水果 有說過價格, 但是輸出價格同時要有水果名稱和顏色
1 --> apple 10元 (紅色)
2 Strawberry 20元 (粉色)
思路方法:
1. 掌握生成菜單腳本方法 case
2. 要有顏色信息顯示
腳本內容信息
#!/bin/bash
RED_COLOR='\E[1;31m'
OVER='\E[0m'
menu(){
cat <<EOF
1. apple
2. Strawberry
3. Pear
4. Grape
5. exit
6. 顯示水果菜單
EOF
}
menu
while true
do
read -p "請選擇你想購買的水果: " fruit
case $fruit in
1)
echo -e "${RED_COLOR} apple價格10元${OVER}"
;;
2)
echo -e "\E[1;36m Strawberry價格20元\E[0m"
;;
3)
echo -e "\E[1;33m Pear價格5元\E[0m"
;;
4)
echo -e "\E[1;35m Grape價格30元\E[0m"
;;
5)
echo "謝謝惠顧"
exit
;;
6)
clear
menu
;;
*)
echo "use $0 請輸入選擇一個水果信息"
esac
done
[root@lsy script 22:27:27]# cat 水果.sh
#!/bin/bash
#劉世亞 0407
#思路:①菜單②顏色③case語句
. /server/script/lsy.sh
meminfo
while true
do
read -p "請根據菜單選擇水果" fr
case $fr in
1)
echo -e "\033[32m apple 價格:10 \033[0m"
;;
2)
echo -e "\033[35m strawberry 價格:20 \033[0m "
;;
3)
echo -e "\033[36m pear 價格:30 \033[0m"
;;
4)
echo -e "\033[34m grape 價格:40 \033[0m"
;;
5)
clear
meminfo
;;
6)
exit
;;
*)
echo "請根據菜單提示輸入"
;;
esac
done
這裏也可以設置一個自定義顏色的函數庫,進行調用顏色函數
編寫一個服務運行腳本 nginx編譯安裝
思路:
①啓動有關 瞭解啓動命令 確認是否成功啓動的機制(查看進程、查看端口、日誌信息)
②關閉服務 瞭解關閉服務命令(識別進程號) 確認是否關閉的機制(查看進程、端口號、查看pid文件)
③重啓服務 將關閉和啓動按照順序操作一遍 是否已經關閉
④查看狀態 是否啓動 是否關閉
腳本內容
#!/bin/bash
case $1 in
start) #啓動
netstat -lntup|grep ":80\b" &>/dev/null #通過端口號的方式判斷服務是否已經啓動
if [ $? -eq 0 ]
then
echo "Nginx is runing..." #如果已經在啓動了,輸出信息
else #如果沒有啓動,則啓動nginx並輸出提示信息
/usr/sbin/nginx
[ $? -eq 0 ] && echo "Nginx start is ok" || echo "Nginx start is failed"
fi
;;
stop) #停止nginx服務,這裏沒有進行判斷在停止之前是什麼狀態
/usr/sbin/nginx -s stop
[ $? -eq 0 ] && echo "Nginx stop is ok" || echo "Nginx stop is failed"
;;
reload) #平滑重啓服務
/usr/sbin/nginx -s reload
[ $? -eq 0 ] && echo "Nginx reload is ok" || echo "Nginx reload is failed"#如果返回值爲0則說明平滑重啓成功,否則就是平滑重啓失敗,給予用戶提示信息
;;
restart)
netstat -lntup|grep ":80\b" &>/dev/null#重啓之前通過查看服務的端口信息判斷服務是否已經開啓,或者關閉(確認restart之前的狀態)
if [ $? -ne 0 ] #如果返回值不等於0 則說明服務已經在restart之前的狀態是關閉的,只需要進行啓動即可
then
/usr/sbin/nginx #進行啓動操作
[ $? -eq 0 ] && echo "Nginx start is ok" || echo "Nginx start is failed" #對進行啓動操作進行確認,判斷啓動操作執行是否成功,並返回響應的提示信息
else #如果返回值等於0,則說明restart之前的狀態是開啓的,既然要進行重啓操作,那麼就是關閉後再啓動
/usr/sbin/nginx -s stop #進行關閉操作
[ $? -eq 0 ] && echo "Nginx stop is ok" || echo "Nginx stop is failed" #確認關閉操作是否執行成功,根據執行成功的與否,返回響應的提示信息
sleep 2 #關閉nginx進程需要一定的時間,如果關閉後立刻重啓會發現端口占用或者其他情況(這是因爲雖然執行了stop的命令,但是系統要有一個處理的時間過程,此時立刻開啓,會出現問題。)
/usr/sbin/nginx #確認關閉後再啓動nginx服務
[ $? -eq 0 ] && echo "Nginx restart is ok" || echo "Nginx restart is failed"#對啓動nginx服務進行確認,根據nginx服務啓動的情況返回不同的提示信息
fi
;;
status)
netstat -lntup|grep ":80\b" &>/dev/null #根據端口信息查看1服務的狀態
if [ $? -eq 0 ]
then
echo "Nginx is runing ..." #如果能查看到端口,則說明服務是運行的,給予提示信息
else
echo "Nginx is not runing ..."#如果不能查看到端口信息,則說明服務是關閉的,給予提示信息
fi
;;
*)
echo "Usage: $0 {start|stop|status|restart|reload}" #如果用戶輸入的參數有問題,沒有匹配到以上任何一個參數選項,則返回提示信息,讓用戶知道自己的操作有誤。
exit 2
esac
最終腳本:
#!/bin/bash
. /etc/init.d/functions
args=$1
fun(){
[ $? -eq 0 ] && action "Nginx $args is " /bin/true || echo "Nginx $args is " /bin/false
}
case $1 in
start)
netstat -lntup|grep ":80\b" &>/dev/null
if [ $? -eq 0 ]
then
echo "Nginx is runing..."
else
/usr/sbin/nginx
fun
fi
;;
stop)
/usr/sbin/nginx -s stop
fun
;;
reload)
/usr/sbin/nginx -s reload
fun
;;
restart)
netstat -lntup|grep ":80\b" &>/dev/null
if [ $? -ne 0 ]
then
/usr/sbin/nginx
[ $? -eq 0 ] && echo "Nginx start is ok" || echo "Nginx start is failed"
else
/usr/sbin/nginx -s stop
[ $? -eq 0 ] && echo "Nginx stop is ok" || echo "Nginx stop is failed"
sleep 2
/usr/sbin/nginx
fun
fi
;;
status)
netstat -lntup|grep ":80\b" &>/dev/null
if [ $? -eq 0 ]
then
echo "Nginx is runing ..."
else
echo "Nginx is not runing ..."
fi
;;
*)
echo "Usage: $0 {start|stop|status|restart|reload}"
exit 2
esac
PS:數據庫不能使用kill進程的方式進行停止
個人感覺 最好還是別使用kill進程的方式停止服務
補充:調用系統本身的函數庫
[root@lsy script 23:43:40]# . /etc/init.d/functions
[root@lsy script 23:43:50]# action "server error" /bin/false
server error [FAILED]
[root@lsy script 23:44:03]# action "server ok" /bin/true
server ok [ OK ]
[root@lsy script 23:44:14]#
編寫一個簡易的跳板機腳本
思路:
①定義可以連接的主機信息 菜單
② 定義連接主機用戶身份 識別是否爲普通用戶
③定義主機連接的方式 ssh基於密鑰連接
④屏蔽一些控制信號
腳本內容
#!/bin/bash
cat<<EOF
1. BACKUP 10.0.0.41
2. WEB02 10.0.0.8
3. WEB03 10.0.0.9
EOF
trap "echo 不要亂按鍵盤,否則服務器將會爆炸" HUP INT TSTP
while true
do
read -p "請輸入連接主機編號信息: " num
case $num in
1)
ssh [email protected]
[ $? -ne 0 ] && echo "connect faild"
;;
2)
ssh [email protected]
[ $? -ne 0 ] && echo "connect faild"
;;
*)
echo "請輸入連接主機信息"
esac
done
PS:腳本可以放置在/etc/profile 中 也可以放在/etc/profile.d/中
注意:有些腳本直接運行,會導致無法操作命令行情況
解決方法一:利用終端信號,終止腳本運行 ctrl+c
解決方法二:利用單用戶模式 (去機房)
解決方法三:ssh 10.0.0.7 “>/server/scripts/jumpserver.sh”
個人認爲預防的辦法:
方法① 在while 語句和case語句中加入一個exit
方法② 寫入開機自動運行的文件中時,不要寫入全局變量
,寫入局部變量,指定某一個用戶進行登錄管理這個腳本。