天天看點

Shell程式設計之case語句實戰(小結)

大家好,今天給大家帶來的是Shell程式設計之case語句的使用!

其實case語句還是很好了解的,在shell程式設計中,if語句有它的文法,函數也有它的文法,那麼在我們shell程式設計中的case語句也是有它的文法的,如下:

case 變量名 in
  值1) 
   指令1 
  ;; 
  值2) 
   指令2 
  ;; 
  值3) 
   指令3 
  ;; 
esac
           

在以上的代碼中我們發現,以case開頭,以esac結尾,就像我們的if語句,以if開頭以fi結束時一樣的。

例2:

case "找老公條件" in   
家裡有房子)     
嫁給你...   ;;    
家庭有背景)     
嫁給你...   ;;    
禮金很豐厚)
可以考慮嫁給你...  ;;
很努力吃苦)     
那麼我們可以先談男女朋友..   ;; 
esac
           

好了接下來我們實踐,其實文法就是上面的一些基本文法,那麼我麼在實踐中來體會case到底有什麼用

其實自我認為case語句更适合一些菜單選項的腳本,那麼我們先用if語句寫一個菜單腳本如下:

#!/bin/bash 
#!/bin/bash 
# Date: 4:42 2019-2-5 
# Mail: [email protected] 
# Founder: <neo> 
# Describe: This is a one - button installation service script  
function CDAN(){ 
cat << yankerp  
1.米飯 
2.面條 
3.包子 
yankerp 
} 
CDAN 
read -p 請您輸入您今天要吃什麼: NUM 
expr $NUM + 1 &>/dev/null
if [ "$?" -ne 0 ] 
 then
  echo "請您輸入{1|2|3}" 
  exit 1 
fi
  
if [ "$NUM" -eq 1 ] 
  then
   echo "小二,來一碗米飯"
elif [ $NUM -eq 2 ] 
  then
   echo "小二,來一碗面條"
elif [ "$NUM" -eq 3 ] 
  then
   echo "小二,來一鍋包子"
fi
           

首先我們看到我們上面的if語句,是不是感覺有點繁瑣,那麼接下來我們使用case語句來實作 如下:

#!/bin/bash 
# Date: 4:42 2018-2-5 
# Mail: [email protected] 
# Founder: <neo_will> 
# Describe: This is a one - button installation service script  
function CDAN(){ 
cat << yankerp  
1.米飯 
2.面條 
3.包子 
yankerp 
} 
CDAN 
read -p 請您輸入您今天要吃什麼: NUM 
expr $NUM + 1 &>/dev/null
if [ "$?" -ne 0 ] 
 then
  echo "請您輸入{1|2|3}" 
  exit 1 
fi
  
case $NUM in
    1) 
     echo "小二,來一碗米飯"
    ;; 
    2) 
     echo "小二,來一碗面條"
    ;; 
    3) 
     echo "小二,來一鍋包子"
    ;; 
esac
           

剖析時刻:

#!/bin/bash 
# Date: 17:18 2019-2-5 
# Mail: [email protected] 
# Founder: <Neo_Will> 
# Describe: This is a one - button installation service script  
function CDAN(){  #定義一個CDAN的函數 
cat << yankerp    
1.米飯 
2.面條 
3.包子 
yankerp 
} 
CDAN       #調用CDAN函數 
read -p 請您輸入您今天要吃什麼: NUM  #輸入一條提示,然後把使用者輸入的字元串指派給變量NUM 
expr $NUM + 1 &>/dev/null     # 使用數值運算指令expr來确定使用者輸入的是否是數值 
if [ "$?" -ne 0 ]         #如果使用者輸入的不是數值 
 then      #那麼 
  echo "請您輸入{1|2|3}"   #列印出 1 2 3  
  exit 1       #最後退出腳本 
fi        #結束if語句 
  
case $NUM in    #這裡就是我們的case語句了,簡單了解,在NUM這個變量中 
    1)       #如果使用者輸入的是1 
     echo "小二,來一碗米飯"    #那麼就輸出一行來一碗米飯 
    ;; 
    2)             #如果在NUM變量中使用者輸入的是2 
     echo "小二,來一碗面條"  #那麼繼續列印此内容 
    ;; 
    3)              #以此類推 
     echo "小二,來一鍋包子"
    ;; 
esac       #最後使用esac結束 
           

我們發現,在多個選項的這些腳本中呢,還是使用case語句是比較友善合适的。

那麼我們掌握了基本的文法和它的一些功能,那麼我們可以結合函數+case語句來完成一個菜單式的安裝腳本如下:

#!/bin/bash 
# Date: 17:18 2019-2-5 
# Mail: [email protected] 
# Founder: <Neo_Will> 
# Describe: This is a one - button installation service script  
function CDAN(){ 
cat << yankerp  
+------------------------------------------------+ 
|                        | 
|    _o0o_     1. 安裝Nginx       | 
|    08880     2. 安裝Apache      | 
|    88"."88     3. 安裝MySQL       | 
|    (|-_-|)     4. 安裝PHP        | 
|    0\=/0     5. 部署LNMP環境     | 
|   __/  \__    6. 安裝zabbix監控    | 
|   ‘\  ///‘     7. 退出此管理程式    | 
|  / Linux一鍵 \   8. 關閉計算機      | 
| ||  Server  ||  ======================  |  
| \         一鍵安裝服務      | 
|  ||| i i i  |||        by Neo_Will  | 
|  ___    ___   ======================  | 
|___‘. /--.--\ .‘___              | 
+------------------------------------------------+ 
yankerp 
} 
CDAN 
. /etc/init.d/functions
BASE_DIR=/usr/local/src
read -p "請您輸入1-8任意字元:" NUM 
expr $NUM + 1 &>/dev/null
if [ "$?" -ne 0 ] 
 then
  echo "請您輸入{1|2|3|4|5|6|7|8}"
  exit 1 
fi
  
function Nginx_server (){ 
  echo "開始安裝Nginx請稍後...."
  yum install -y gcc gcc-c++ pcre-devel zlib-devel openssl-devel &>/dev/null
  cd $BASE_DIR && wget http://nginx.org/download/nginx-1.12.2.tar.gz &>/dev/null && useradd -M -s /sbin/nologin nginx && \ 
tar zxf nginx-1.12.2.tar.gz && cd $BASE_DIR/nginx-1.12.2/ && \  
  ./configure --prefix=/usr/local/nginx --with-http_dav_module--with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module--with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx &>/dev/null
  if [ "$?" -eq 0 ] 
   then
    make && make install &>/dev/null
  fi
if [ -f /usr/local/nginx/sbin/nginx ];then
  ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin && nginx && echo "Nginx安裝成功!"
fi
} 
        
function Apache_server (){ 
  echo "開始安裝Apache請稍後"
  yum install httpd -y &>/dev/null
  if [ "$?" -eq 0 ] 
   then 
    echo "Apache安裝成功!"
   else
    echo "Apache安裝失敗!"
  fi
} 
  
case $NUM in
  1) 
   Nginx_server 
  ;; 
  2) 
   Apache_server 
  ;; 
esac
           

以上腳本大家可以參考參考,很簡單實作,那麼接下來在來一個案例

實戰2:程式設計Nginx啟動腳本

編譯安裝的Nginx是沒有啟動腳本的,這時候我們可以選擇自己寫一個,在這裡我用我的思路給大家解釋整個過程雖然不是很規範,希望還是能夠幫助到你如下:

#!/bin/bash 
BASE_DIR=/usr/local/nginx/sbin/
PID=/usr/local/nginx/logs/nginx.pid 
#no1.判斷是否root使用者登入 
if [ "$UID" -ne 0 ] 
 then
  echo "請您使用root使用者登入!!!"
 exit 1 
fi
. /etc/init.d/functions 
#判斷使用者輸入的傳參個數 
if [ "$#" -ne 1 ] 
  then
    echo "/bin/bash $0 {start|stop|restart}"
  exit 1 
fi
  
#編寫啟動Nginx函數 
function start (){ 
  if [ `netstat -anput | grep nginx | wc -l` -eq 0 ] 
    then
     $BASE_DIR/nginx
  fi
    if [ "$?" -eq 0 ] 
     then
      action "Nginx啟動成功!" /bin/true
     else
      action "Nginx啟動失敗!" /bin/false
    fi
} 
  
#編寫停止Nginx函數 
function stop (){ 
  if [ `netstat -anput | grep nginx | wc -l` -ne 0 ] 
    then
     $BASE_DIR/nginx -s stop 
  fi
    if [ "$?" -eq 0 ] 
     then
      action "Nginx停止成功!" /bin/true
     else
      action "Nginx停止失敗!" /bin/false
    fi
} 
  
#編寫case語句 使用特殊的位置變量$1來判斷使用者輸入的内容 
case $1 in
  start) 
     start 
  ;; 
  stop) 
     stop 
  ;; 
    restart) 
     stop 
     start 
  ;; 
esac
           

運作如下:

#!/bin/bash 
BASE_DIR=/usr/local/nginx/sbin/
PID=/usr/local/nginx/logs/nginx.pid 
#no1.判斷是否root使用者登入 
if [ "$UID" -ne 0 ] 
 then
  echo "請您使用root使用者登入!!!"
 exit 1 
fi
. /etc/init.d/functions 
#判斷使用者輸入的傳參個數 
if [ "$#" -ne 1 ] 
  then
    echo "/bin/bash $0 {start|stop|restart}"
  exit 1 
fi
  
#編寫啟動Nginx函數 
function start (){ 
  if [ `netstat -anput | grep nginx | wc -l` -eq 0 ] 
    then
     $BASE_DIR/nginx
  fi
    if [ "$?" -eq 0 ] 
     then
      action "Nginx啟動成功!" /bin/true
     else
      action "Nginx啟動失敗!" /bin/false
    fi
} 
  
#編寫停止Nginx函數 
function stop (){ 
  if [ `netstat -anput | grep nginx | wc -l` -ne 0 ] 
    then
     $BASE_DIR/nginx -s stop 
  fi
    if [ "$?" -eq 0 ] 
     then
      action "Nginx停止成功!" /bin/true
     else
      action "Nginx停止失敗!" /bin/false
    fi
} 
  
#編寫case語句 使用特殊的位置變量$1來判斷使用者輸入的内容 
case $1 in
  start) 
     start 
  ;; 
  stop) 
     stop 
  ;; 
    restart) 
     stop 
     start 
  ;; 
esac