天天看點

Shell腳本----條件判斷邏輯控制—條件判斷

文章目錄

  • 邏輯控制---條件判斷
    • 一、條件判斷的實作
    • 二、if的簡單結構
      • 1、條件的寫法
        • 1)、數字表達式
        • 2)、字元表達式
        • 3)檔案目錄表達式
      • 2、單分支if
      • 3、多分支if
        • 1)、多條件的寫法
      • 4、嵌套if
      • 5、case條件判斷
        • 1)、位置變量

邏輯控制—條件判斷

一、條件判斷的實作

  • if
  • case

二、if的簡單結構

if 條件 ; then
	執行的操作
	執行的操作
fi
           

1、條件的寫法

  • shell 指令
    • 判斷指令的執行狀态碼
  • [ 表達式 ]
    • 數字表達式
    • 字元表達式
    • 檔案目錄表達式

1)、數字表達式

  • [ 數字 -eq 數字 ] 等于
  • [ 數字 -ne 數字 ] 不等于
  • [ 數字 -gt 數字 ] 大于
  • [ 數字 -ge 數字 ] 大于等于
  • [ 數字 -lt 數字 ] 小于
  • [ 數字 -le 數字 ] 小于等于

(1)、數字表達式腳本示例

  • 自動挂載CD光牒
#!/bin/bash
#

mount -a &> /dev/null
if df -Th | grep "iso9660" &> /etc/null ; then
        mount_dir=$(df -Th | grep "iso9660" | awk '{print $7}')
        echo "CD光牒已挂載到$mount_dir"
else
        sed -ri '$a \/dev/sr0 /mnt/ iso9660 defaults 0 0' /etc/fstab
        mount -a &> /dev/null
        mount_name=$(df -Th | grep "iso9660" | awk '{print $1}')
        echo "已成功挂載CD光牒$mount_name"
fi
           
  • 自動建立使用者
#!/bin/bash/
#

read -p "請輸入使用者名:" user
read -p "請輸入密碼" passwd
grep "^$user:" /etc/passwd &> /etc/null
if [ $? -ne 0 ]; then
        useradd $user
        echo $passwd | passwd --stdin $user &> /etc/null
        echo "$user使用者建立成功"
else
        echo "$user已存在"
fi
           
  • 判斷使用者UID與組ID是否一緻
#!/bin/bash/
#

read -p "請輸入使用者名:" user
grep "^$user:" /etc/passwd &> /etc/null
id_num=$(id $user -u)
grp_num=$(id $user -g)
if [ $id_num -eq $grp_num ]; then
        echo "Good,使用者ID與組ID一緻!"
else
        echo "No,使用者ID與組ID不一緻!"
fi
           
  • 擷取磁盤使用率超過則報警
#!/bin/bash
#

usage=$(df -Th | grep "/$" | awk '{print $6}' | awk -F% '{print $1}')
if [ $usage -ge 60 ]; then
        echo "警告!警告!目前目錄使用率為:${usage}% ,目錄磁盤使用率超過60%!!!"
else
        echo "目前目錄使用率為:${usage}%, 根目錄使用率未超過60%"
fi

           

2)、字元表達式

  • == 兩個字元相等
  • != 不等
  • [ -z 字元 ] 判斷字元是否為空字元
  • 在shell腳本中空格也是代表某一個字元,如果想在if語句條件判斷中加入空格,需要将 “條件判斷” 加雙引号

(1)字元表達式腳本示例

#!/bin/bash
#

read -p "請輸入密碼:" pwd1
read -p "确認密碼:" pwd2
if [ "$pwd1" == "$pwd2" ]; then
        echo "密碼修改成功!"
else
        echo "密碼不一緻!"
fi    
           

3)檔案目錄表達式

  • [ -e 檔案目錄名稱 ] 判斷檔案目錄是否存在
  • [ -f 檔案名稱 ] 判斷文本檔案
  • [ -d 檔案名稱 ] 判斷是否為目錄
  • [ -b 檔案名稱 ] 判斷是否為塊裝置檔案
  • [ -l 檔案名稱 ]
  • [ -s 檔案名稱 ]
  • [ -r 檔案名稱 ] [ -w 檔案名稱 ] [ -x 檔案名稱 ]

所有單目表達式支援使用!取反 [ ! -e /opt/file01 ]

2、單分支if

if 條件; then
    執行的操作
    執行的操作
else
	執行的操作
	執行的操作
fi
           

3、多分支if

if 條件1; then
	執行的操作
	執行的操作 
elif 條件2; then 
	執行的操作
	執行的操作
elif 條件3; then 
	執行的操作
	執行的操作
else
	執行的操作
	執行的操作
fi 
           

1)、多條件的寫法

  • 注意多條件隻要有一個符合條件就會退出
  • and 并且
    • [ 條件1 -a 條件2 ]
    • [ 條件1 ] && [ 條件2 ]
  • or 或者
    • [ 條件1 -o 條件2 ]
    • [ 條件1 ] || [ 條件2 ]

(1)多條件腳本示例

  • 判斷使用者輸入

    Linux, linux 顯示redhat

    windows, Windows, 顯示Microsoft

    mac, MAC, 顯示apple

    顯示其他

#!/bin/bash
#
echo "----選擇下列的系統----"
echo "Linux、linux"
echo "windows、Windows"
echo "mac、MAC"
echo "----------------------"
read -p "請輸入系統:" system
if [ $system == linux -o $system == Linux ]; then
        echo 
        echo "該系統為:RedHat System"
elif [ $system == windows -o $system == Windows ]; then
        echo
        echo "該系統為:Microsoft System"
elif [ $system == mac -o $system == MAC ]; then
        echo
        echo "該系統為:Apple System"
else
        echo "其他作業系統"
           

4、嵌套if

  • 适用于多層判斷
if  條件; then
      if  條件; then
             執行的操作
             執行的操作
      else
             執行的操作
             執行的操作
      fi
else
        執行的操作
        執行的操作
fiw
           

1)嵌套腳本示例

  • 删除檔案的空行和注釋行
#!/bin/bash
#

read -p "請輸入要過濾的源檔案:" file_name
if [ -e $file_name ];  then
	if grep "^$" $file_name &> /dev/null; then
		Hnumber=$(grep -n "^$" $file_name)
		echo "空行的行号為:"
		echo $Hnumber
		sed -i -e '/^$/d' -e '/^#/d'  $file_name
		echo "删除空行後的檔案為:"
		echo
		cat $file_name
	fi
else 
	echo "源檔案不存在!"
fi

           

5、case條件判斷

  • 适用于判斷某個變量有多種固定的取值時
case  變量 in 
值1)
     執行的操作
     執行的操作
     ;; 
值2)
      執行的操作 
      執行的操作
      ;; 
值3)
    執行的操作 
    執行的操作
    ;; 
*)
    執行的操作 
    執行的操作
    ;; 
esac
           

1)、位置變量

  • $1 $2 $3 $4…$9 ${10}
    • $1 指令第一個參數,$2第二個參數
    • $0 指令自身
    • $#
      • 參數的個數
  • case腳本示例
#!/bin/bash
#
if [ $# -eq 0 ]; then
        echo "指令輸入錯誤,幫助資訊: $0 <linux|Linux|windows|Windows|mac|MAC>"
        exit 78
fi

case $1 in
        linux|Linux)
        echo "RedHat"
        ;;
        windows|Windows)
        echo "Microsoft"
        ;;
        mac|MAC)
        echo "Apple"
        ;;
        *)
        echo "Others"
        ;;
esac
           
  • 位置變量腳本示例
1 #!/bin/bash
  2 #
  3 
  4 nginx_file=/usr/local/nginx/sbin/nginx
  5 nginx_pid=/usr/local/nginx/logs/nginx.pid
  6 
  7 if [ -z $1 ]; then
  9         exit 100
 10 fi
 11 
 12 case $1 in
 13         start)
 14         if [ -e $nginx_pid ]; then
 15                 echo "Nginx 正在運作"
 16         else
 17                 $nginx_file
 18                 if [ $? -eq 0 ]; then
 19                         echo "Nginx 啟動成功"
 20                 else
 21                         echo "Nginx 啟動失敗"
 22                 fi
 23         fi
 24         ;;
 25         stop)
 26         if [ -e $nginx_pid ]; then
 27                 $nginx_file -s stop
 28                 if [ $? -eq 0 ]; then
 29                         echo "Nginx 成功停止"
 30                 else
 31                         echo "Nginx 停止失敗"
 32                 fi
 33         else
 34                 echo "Nginx 未在運作"
 35         fi
 36         ;;
 37         reload)
 38         kill -1 $(cat $nginx_pid)
 39         if [ $? -eq 0 ]; then
 40                 echo "Nginx 成功重新加載"
 41         else
 42                 echo "重新加載失敗"
 43         fi
 44         ;;
 45         restart)
 46         if [ -e $nginx_pid ]; then
 47                 $nginx_file -s stop
 48                 if [ $? -eq 0 ]; then
 49                         echo "Nginx 正在重新啟動"
 50                 else
 51                         echo "Nginx 啟動失敗!!"
 52                 fi
 53                 sleep 1
 54                 $nginx_file
 55                 if [ $? -eq 0 ]; then
 56                         echo "Nginx 重新啟動成功"
 57                 else
 58                         echo "Nginx 重新啟動失敗"
 59                 fi
 62                 $nginx_file -s stop
 63                 if [ $? -eq 0 ]; then
 64                         echo "Nginx 正在重新啟動"
 65                 else
 66                         echo "Nginx 啟動失敗!!"
 67                 fi
 68                 sleep 1
 69                 $nginx_file
 70                 if [ $? -eq 0 ]; then
 71                         echo "Nginx 重新啟動成功"
 72                 else
 73                         echo "Nginx 重新啟動失敗"
 74                 fi
 75         fi
 76         ;;
 77         status)
 78         if [ -e $nginx_pid ]; then
 79                 echo "Nginx PID's $(cat $nginx_pid) 正在運作"
 80         else
 81                 echo "Nginx 已經停止"
 82         fi
 83         ;;
 84         start_auto)
 85         chmod a+x /etc/rc.d/rc.local
 87         if [ $? -eq 0 ]; then
 88                 echo "正在寫入開機自啟配置檔案中......"
 89                 source /etc/rc.d/rc.local
 90                 if [ $? -eq 0 ]; then
 91                         echo "Nginx 成功開機自啟!"
 92                 fi
 93         else
 94                 echo "寫入開機自動配置檔案失敗!!!"
 95         fi
 96         ;;
 97         Cancel_startup)
 98         if grep "nginx" /etc/rc.d/rc.local &> /dev/null; then
 99                 echo "正在取消開機自啟"
100                 sed -ri '/nginx/d' /etc/rc.d/rc.local
101                 if [ $? -eq 0 ]; then
102                         echo "成功取消開機自啟"
103                 else
104                         echo "取消開機自啟失敗!!!"
105                 fi
106         else
107                 echo "Nginx 目前開機不自啟"
108         fi
109         ;;
110         *)
111         echo "幫助:$0 <status|start|stop|reload|restart>"
112         exit 101
113         ;;
114 esac
           

繼續閱讀