case語句實現流程控制

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
方法② 寫入開機自動運行的文件中時,不要寫入全局變量,寫入局部變量,指定某一個用戶進行登錄管理這個腳本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章