case主要作用是對程式的選擇,迴圈等操作 #語法: case 變數 in 變數值1) 命令序列 ;; #命令序列結束符 變數值2) 命令序列 ;; 變數值3) 命令序列 ;; 變數值N) 命令序列 ;; *) #不符合上面所有條件 命令序列 exit #或者其他命令 esac #語法示例 安裝不同PHP的版本 1. 選單, PHP版本的選單 2. 提示使用者根據選單進行選擇安裝不同的PHP版本 3. 根據使用者選擇進行安裝不同的PHP版本 [root@shell01 scripts]# vim case-1.sh #!/bin/bash #1.準備PHP的版本選單 cat<<EOF ########################## 1.安裝PHP-5.5版本 2.安裝PHP-5.6版本 3.安裝PHP-7.1版本 4.退出當前安裝 ########################## EOF #2.提示使用者根據選單進行選擇安裝不同的PHP版本 read -p "請根據上方選單進行選擇安裝不同的PHP版本[1|2|3|4]: " Install #3.根據使用者的選擇,進行安裝不同的版本 case $Install in 1) echo "你閒著了安裝PHP-5.5版本........." echo "正在安裝PHP-5.5版本,請稍後......" sleep 3 #等待3秒 echo "PHP-5.5版本安裝成功............." ;; 2) echo "你閒著了安裝PHP-5.6版本........." echo "正在安裝PHP-5.6版本,請稍後......" sleep 3 #等待3秒 echo "PHP-5.6版本安裝成功............." ;; 3) echo "你閒著了安裝PHP-7.1版本........." echo "正在安裝PHP-7.1版本,請稍後......" sleep 3 #等待3秒 echo "PHP-7.1版本安裝成功............." ;; 4) echo "你沒有選擇安裝任何PHP版本! 程式退出!" exit ;; *) echo "你的選擇不符合要求!請根據上方選單進行選擇[1|2|3|4]." exit esac
1.編寫一個rsync的啟動停止指令碼 實現: start stop status restart 1.如何啟動rsync /usr/bin/rsync --daemon 2.如何停止rsync pkill rsync #注意: 千萬不要使用rsync作為指令碼的名字 3.參考系統中其他服務的pid檔案,我們自己建立 #(這裡不是用system管理,無法用system status去檢視) [root@shell01 scripts]# vim case-2.sh #!/bin/bash #1.引用函式庫 [ -f /etc/init.d/functions ] && source /etc/init.d/functions || echo "函式庫檔案不存在!" #2.判斷位置變數的個數是否只有一個 if [ $# -ne 1 ];then echo "Usage: $0 {start|stop|status|restart}" exit fi #3.編寫case語句選項 Pid_File=/var/run/rsync.pid #這裡啟動不會自動建立pid檔案,需要指令碼自行建立 case $1 in start) if [ -f $Pid_File ];then action "服務Rsync正在執行中......" /bin/true exit else #當服務要啟動的時候,需要手動建立pid檔案 touch $Pid_File && /usr/bin/rsync --daemon &>/dev/null && sleep 3 #給3秒啟動時間 if [ $? -eq 0 ];then action "服務Rsync啟動成功....." /bin/true else action "服務Rsync啟動失敗....." /bin/false fi fi ;; stop) if [ -f $Pid_File ];then #當服務在啟動的狀態下,pid檔案是存在的,如果需要停止服務,同樣需要把pid檔案刪除 rm -f $Pid_File && pkill rsync && sleep 2 if [ $? -eq 0 ];then action "服務Rsync停止成功......" /bin/true else action "服務Rsync停止失敗......" /bin/false fi else action "服務Rsync不在執行中......" /bin/true exit fi ;; status) #當pid檔案存在時,則服務在執行中,pid檔案不存在時,服務不在執行中 if [ -f $Pid_File ];then action "服務Rsync正在執行中......" /bin/true else action "服務Rsync不在執行中......" /bin/true fi ;; restart) #重啟,當服務正在執行中,需要停止服務再啟動服務,當服務不在執行中,需要直接啟動 if [ -f $Pid_File ];then #停止服務 rm -f $Pid_File && pkill rsync && sleep 2 if [ $? -eq 0 ];then action "服務Rsync停止成功......" /bin/true else action "服務Rsync停止失敗......" /bin/false fi #啟動服務 touch $Pid_File && /usr/bin/rsync --daemon &>/dev/null && sleep 3 if [ $? -eq 0 ];then action "服務Rsync啟動成功....." /bin/true else action "服務Rsync啟動失敗....." /bin/false fi action "服務Rsync重啟成功...." /bin/true else action "服務Rsync不在執行中......" /bin/true #啟動服務 touch $Pid_File && /usr/bin/rsync --daemon &>/dev/null && sleep 3 if [ $? -eq 0 ];then action "服務Rsync啟動成功....." /bin/true else action "服務Rsync啟動失敗....." /bin/false fi action "服務Rsync重啟成功...." /bin/true fi ;; *) echo "Usage: $0 {start|stop|status|restart}" exit esac
start stop status restart reload 1.怎麼啟動Nginx /usr/sbin/nginx 2.怎麼停止Nginx /usr/sbin/nginx -s stop 3.怎麼進行重啟Nginx 先stop 再start 4.怎麼進行平滑重啟Nginx /usr/sbin/nginx -s reload 5.在什麼情況下,才能進行平滑重啟 只有在Nginx服務在執行的時候,才能進行平滑重啟。如果Nginx服務沒有在執行中,是不能進行平滑重啟的。 ----------------------------------- [root@shell01 scripts]# vim case-3.sh #!/bin/bash #1.引用函式庫 [ -f /etc/init.d/functions ] && source /etc/init.d/functions || echo "函式庫檔案不存在!" #2.判斷位置變數是否存在且只有一個 if [ $# -ne 1 ];then echo "Usage: $0 {start|stop|status|restart|reload}" exit fi #3.編寫case語句 Pid_File=/var/run/nginx.pid case $1 in start) if [ -f $Pid_File ];then action "Nginx服務正在執行中......." /bin/true else /usr/sbin/nginx &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務啟動成功......" /bin/true else action "Nginx服務啟動失敗......" /bin/false fi fi ;; stop) if [ -f $Pid_File ];then /usr/sbin/nginx -s stop &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務停止成功......" /bin/true else action "Nginx服務停止失敗......" /bin/false fi else action "Nginx服務不在執行中......" /bin/true fi ;; status) if [ -f $Pid_File ];then action "Nginx服務正在執行中......" /bin/true else action "Nginx服務不在執行中......" /bin/true fi ;; restart) if [ -f $Pid_File ];then #先停止服務 /usr/sbin/nginx -s stop &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務停止成功...." /bin/true else action "Nginx服務停止失敗...." /bin/false fi #啟動服務 /usr/sbin/nginx &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務啟動成功......" /bin/true action "Nginx服務重啟成功......" /bin/true else action "Nginx服務啟動失敗......" /bin/false fi else action "Nginx服務不在執行中....." /bin/false #啟動服務 /usr/sbin/nginx &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務啟動成功......" /bin/true action "Nginx服務重啟成功......" /bin/true else action "Nginx服務啟動失敗......" /bin/false fi fi ;; reload) if [ -f $Pid_File ];then /usr/sbin/nginx -s reload &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務平滑重啟成功......" /bin/true else action "Nginx服務平滑重啟失敗......" /bin/false fi else action "Nginx服務沒有在執行中,無法進行平滑重啟...." /bin/false fi ;; *) echo "Usage: $0 {start|stop|status|restart|reload}" exit esac -----------------------------------------
#測試 [root@shell01 scripts]# sh case-3.sh Usage: case-3.sh {start|stop|status|restart|reload} [root@shell01 scripts]# sh case-3.sh start Nginx服務正在執行中....... [ OK ] [root@shell01 scripts]# sh case-3.sh stop Nginx服務停止成功...... [ OK ]
#加鎖機制 當這個指令碼被某一個人執行的時候,別人是無法執行的,只能等待執行結束之後,才能執行 #最佳化指令碼(透過建立檔案,判斷檔案是否存在來實現鎖的功能) ----------------------------------------------- [root@shell01 scripts]# vim case-3.sh #!/bin/bash #1.引用函式庫 [ -f /etc/init.d/functions ] && source /etc/init.d/functions || echo "函式庫檔案不存在!" #2.判斷位置變數是否存在且只有一個 if [ $# -ne 1 ];then echo "Usage: $0 {start|stop|status|restart|reload}" exit fi #2.5 進行加鎖機制 Suo_File=/tmp/nginx.lock if [ -f $Suo_File ];then echo "此指令碼$0 正在執行中,請稍後再執行......" exit fi #2.6 加鎖 touch $Suo_File &>/dev/null #3.編寫case語句 Pid_File=/var/run/nginx.pid case $1 in start) if [ -f $Pid_File ];then action "Nginx服務正在執行中......." /bin/true else /usr/sbin/nginx &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務啟動成功......" /bin/true else action "Nginx服務啟動失敗......" /bin/false fi fi ;; stop) if [ -f $Pid_File ];then /usr/sbin/nginx -s stop &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務停止成功......" /bin/true else action "Nginx服務停止失敗......" /bin/false fi else action "Nginx服務不在執行中......" /bin/true fi ;; status) if [ -f $Pid_File ];then action "Nginx服務正在執行中......" /bin/true else action "Nginx服務不在執行中......" /bin/true fi ;; restart) if [ -f $Pid_File ];then #先停止服務 /usr/sbin/nginx -s stop &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務停止成功...." /bin/true else action "Nginx服務停止失敗...." /bin/false fi #啟動服務 /usr/sbin/nginx &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務啟動成功......" /bin/true action "Nginx服務重啟成功......" /bin/true else action "Nginx服務啟動失敗......" /bin/false fi else action "Nginx服務不在執行中....." /bin/false #啟動服務 /usr/sbin/nginx &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務啟動成功......" /bin/true action "Nginx服務重啟成功......" /bin/true else action "Nginx服務啟動失敗......" /bin/false fi fi ;; reload) if [ -f $Pid_File ];then /usr/sbin/nginx -s reload &>/dev/null && sleep 2 if [ $? -eq 0 ];then action "Nginx服務平滑重啟成功......" /bin/true else action "Nginx服務平滑重啟失敗......" /bin/false fi else action "Nginx服務沒有在執行中,無法進行平滑重啟...." /bin/false fi ;; *) echo "Usage: $0 {start|stop|status|restart|reload}" # 這裡刪掉exit esac #4.解鎖(上方不要出現exit) rm -f $Suo_File &>/dev/null ---------------------------------------- #測試 [root@shell01 scripts]# sh case-3.sh stop Nginx服務停止成功...... [ OK ] #在另一個視窗同時執行指令碼 [root@shell01 scripts]# sh case-3.sh stop 此指令碼case-3.sh 正在執行中,請稍後再執行......