1. 程式人生 > >Shell指令碼中的邏輯判斷、檔案目錄屬性判斷、if特殊用法 、 case判斷

Shell指令碼中的邏輯判斷、檔案目錄屬性判斷、if特殊用法 、 case判斷

Shell指令碼中的邏輯判斷

在shell腳本當中很多地方都會用到邏輯判斷,判斷某一個數值,判斷某個目錄或檔案,然後針對判斷的結果再做一個操作,若沒有判斷,是無法進行一些操作的. 
例如cp一些檔案,或者MV,或是刪除某個檔案,沒有判斷,寫這些命令就沒什麼意義,也就不叫作shell指令碼,可見shell指令碼非常重要.

shell當中常見的邏輯判斷語法

格式1:if條件;then 語句;if
格式2:if條件;then 語句;else 語句;if
格式3:if ....; then ....;elif...; then...; else...; fi 
-lt (小於)
-gt (大於)
-le (小於或等於)
-ge(大於或等於)
-eq(等於)
-ne(不等於)
&& 表示並且
|| 表示或者

#在命令列裡也可以實現,不一定要寫shell指令碼才可以實現,只不過使用命令去實現需要使用分號.
[[email protected] ~]# for i in `seq 1 5`; do echo $i; done
1
2
3
4
5


#不使用分號將會是這樣的
[[email protected] ~]# for i in `seq 1 5`
> do
> echo $i
> done
1
2
3
4
5


格式1:if條件;then 語句;if

在命令列操作
[[email protected] ~]# a=6

[[email protected]
~]# if [ $a -gt 3 ]; then echo ok; fi ok 說明:方括號兩邊需要有空格,-gt 是大於, $a大於3,那麼這肯定OK的. 在腳本里寫,就整理一下格式即可,然後再執行 [[email protected] sbin]# cat 04.sh #! /bin/bash a=6 if [ $a -gt 3 ] then echo ok fi [[email protected] sbin]# sh 04.sh ok


格式2:if條件;then 語句;else 語句;if

[[email protected] sbin]# vim 05.sh 
#! /bin/bash a=2 if [ $a -gt 3 ] then echo ok else echo nook fi [[email protected] sbin]# sh -x 05.sh + a=2 + '[' 2 -gt 3 ']' + echo nook nook #如果$a 大於3,輸出OK, 否則(else),輸出nook

 格式3:if ....; then ....;elif...; then...; else...; fi 

# 滿足一個條件的情況
[[email protected] sbin]# vim 06.sh

#! /bin/bash
a=6
if [ $a -gt 3 ]
then
    echo ">3"
elif [ $a -lt 8 ]
    echo "<8 && >3"
else
   echo nook
fi


#執行過程
[[email protected] sbin]# sh -x 06.sh
+ a=6
+ '[' 6 -gt 3 ']'
+ echo '>3'
>3


說明:如果$a 大於3,輸出>3 ;又如果(elif)$a 小於8,輸出<8 && >3
     那滿足了第一個條件,$a 大於3,輸出>3,後面的條件就不再執行了.
     elif 是可以使用多次的;
     lt 是小於



#所有條件都不滿足的情況
[[email protected] sbin]# vim 06.sh
#! /bin/bash
a=6
if [ $a -gt 7 ]
then
    echo ">7"
elif [ $a -lt 5 ]
then
    echo "<5 && >7"
else
   echo "nook"
fi


執行過程
[[email protected] sbin]# sh -x 06.sh
+ a=6
+ '[' 6 -gt 7 ']'
+ '[' 6 -lt 5 ']'
+ echo nook
nook

說明:如果$a 大於7,輸出>7,不滿足,執行下一個條件,又如果$a 小於5,輸出<5 && >7,都不滿足,輸出nook


 檔案目錄屬性判斷

[ -f file ] 判斷是否是普通檔案,且存在
[ -d file ] 判斷是否是目錄,且存在
[ -e file ] 判斷檔案或者目錄是否存在
[ -r file ] 判斷檔案是否可讀
[ -w file ] 判斷檔案是否可寫
[ -x file ] 判斷檔案是否可執行

[ -f file ] 判斷是否是普通檔案,且存在

# 判斷檔案是否存在,若不存就建立
[[email protected] sbin]# vim file1.sh
#! /bin/bash
f="/tmp/linux"
if [ -f $f ]
then
    echo $f exist
else
    touch $f
fi


#執行過程
[[email protected] sbin]# sh -x file1.sh
+ f=/tmp/linux
+ '[' -f /tmp/linux ']'
+ touch /tmp/linux



說明:if [ -f $f ]  判斷/tmp/linux 是否存在,明顯是不存在的,所有就touch 了這個檔案


# 重新執行一次,判斷檔案是否存在,若存就輸出結果
[[email protected] sbin]# sh -x file1.sh
+ f=/tmp/linux
+ '[' -f /tmp/linux ']'
+ echo /tmp/linux exist
/tmp/linux exist

說明:前面不存在就touch了, 重新再執行一次肯定是存在的這個檔案,那麼判斷輸出是存在

[ -d file ] 判斷是否是目錄,且存在

# 判斷目錄是否存在,若不存在就建立
[[email protected] sbin]# cat file2.sh 
#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
    echo $d exist
else
    mkdir $d
fi

#執行過程
[[email protected] sbin]# sh -x file2.sh 
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ mkdir /tmp/Anna


說明:if [ -d $d ]  判斷/tmp/linux 是否存在,明顯是不存在的,所有就mkdir 了這個檔案



#重新執行一次,判斷目錄是否存在,若存在就輸出
[[email protected] sbin]# sh -x file2.sh 
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ echo /tmp/Anna exist
/tmp/Anna exist


說明:前面不存在就mkdir了, 重新再執行一次肯定是存在的這個檔案,那麼判斷輸出是存在


[ -e file ] 判斷檔案或者目錄是否存在

[[email protected] sbin]# cat file2.sh 
#! /bin/bash
f="/tmp/Anna"
if [ -e $f ]
then
    echo $f exist
else
    mkdir $f
fi



#執行過程
[[email protected] sbin]# sh -x file2.sh 
+ f=/tmp/Anna
+ '[' -e /tmp/Anna ']'
+ echo /tmp/Anna exist
/tmp/Anna exist


說明:-e 不管是檔案或目錄,是判斷是否存在,不存在的話就touch

[ -r file ] 判斷檔案是否可讀

[[email protected] sbin]# vim file2.sh 

#! /bin/bash
f="/tmp/Anna"
if [ -r $f ]
then
    echo $f readable
fi


#執行
[[email protected] sbin]# sh file2.sh 
/tmp/Anna readable

[ -w file ] 判斷檔案是否可寫

[[email protected] sbin]# vim file2.sh 

#! /bin/bash
f="/tmp/Anna"
if [ -r $f ]
then
    echo $f readable
fi



#執行
[[email protected] sbin]# sh file2.sh 
/tmp/Anna writeable



說明:可寫是針對當前root使用者,若切換到user使用者,那麼就只有可讀的許可權,沒有可讀許可權

[ -x file ] 判斷檔案是否可執行

[[email protected] sbin]# vim file2.sh 

#! /bin/bash
f="/tmp/Anna"
if [ -x $f ]
then
    echo $f exeable
fi


#執行
[[email protected] sbin]# sh file2.sh 
/tmp/Anna exeable


說明:可寫是針對當前root使用者,若切換到user使用者,那麼就只有可讀的許可權,沒有可執行許可權

判斷一個目錄是否存在,如果存在刪除掉

[[email protected] sbin]# vim file2.sh 

#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
   rmdir $d
fi



#執行
[[email protected] sbin]# sh -x file2.sh 
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ rmdir /tmp/Anna


#判斷一個目錄是否存在,如果存在就輸出This is ok, 若不存在就建立
[[email protected] sbin]# vim file2.sh 

#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
   echo "This is ok"  
else [ -d $d ]
   mkdir $d
fi


#執行
[[email protected] sbin]# sh -x file2.sh 
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ echo 'This is ok'
This is ok


if特殊用法

if [ -z "$a" ]  表示當變數a 的值為空時會怎麼樣
if [ -n "$a" ]  表示當變數a的值不為空
if grep -q '123' 1.txt; then 表示如果1.txt中含有‘123’的行時會怎樣
if [ ! -e file ]; then ... 表示檔案不存在時會怎樣
if (($a<1)); then .. 等同於 if [ $a -lt 1 ]; then...
[ ] 中不能使用 <,>, ==, !=,>=,<=這樣的符號

if [ -n "$a" ]  表示當變數a的值不為空
if [ -z "$a" ]  表示當變數a 的值為空

if [ -n "$a" ]  表示當變數a的值不為空
[[email protected] sbin]# if [ -n 09.sh ]; then echo ok; else echo "09.sh is null"; fi
ok


說明: 判斷01.sh 是否為空,不為空 ,輸出is ok 



# if [ -z "$a" ]  表示當變數a 的值為空 
[[email protected] sbin]# if [ -z "$b" ]; then echo no null; fi
no null

說明:


     

if [ ! -e file ]; then ... 表示檔案不存在時會怎樣

[[email protected] sbin]# vim file3.sh

#! /bin/bash
if [ ! -f /tmp/Annalinux ]
then
    echo "No such file or directory"
    exit
fi
if [ -f /tmp/Annalinux ]
then
    echo "This is file"
    exit
fi

[[email protected] sbin]# sh -x file3.sh 
+ '[' '!' -f /tmp/Annalinux ']'
+ '[' -f /tmp/Annalinux ']'
+ echo 'This is file'
This is file
+ exit

說明: 先判斷/tmp/Annalinux 檔案是否存在,如果不存在,輸出 No such file or directory。並退出
      如果存在,輸出This is file,並退出.
       ! -F 表示不存在
       -f 表示存在
       ! -f  和 -f  意思相反

在邏輯判斷中,還可以根據判斷結果,作為判斷結果

[[email protected] sbin]# if grep -w 'apache' /etc/passwd; then echo "apache exist"; fi
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
apache exist
[[email protected] sbin]# if grep -wq 'apache' /etc/passwd; then echo "apache exist"; fi
apache exist



說明: 如果apache這個單詞在/etc/passwd 這個檔案存在,輸出apache exist
      grep -w 選項表示匹配一個單詞, -q不顯示任何資訊



[[email protected] sbin]# if ! grep -w 'user1' /etc/passwd; then echo useradd user1; fi
useradd user1


說明:  if ! grep -w 'user1' 取反的意思,如果user1這個使用者不存在,那麼建立user1使用者.

 cace判斷

case 邏輯判斷

說明:這個指令碼的目的是讓使用者輸入一個數字,然後用這個指令碼去判斷使用者輸入的數字的一個範圍

[[email protected] sbin]# vim case.sh

#! /bin/bash
read -p " Please input a number: "n
if [ -z "$n" ]                         //判斷 $n是否為空, 為空的話,說明使用者沒有輸入數字
then 
     echo "Please input a number."     //那麼就提示請輸入數字
     exit 1                            //然後退出來,返回一個數值 1                
fi
n1=`echo $n |sed 's/[-0-9]//g'`        //判斷輸入的是否是純數字,echo 出來後,做一個特殊操作,使用sed 把所有
                                         的數字 0-9 清空, $n1 這個變數就為空了
if [ ! -z $n1 ]                        // 當變數不為空時,說明輸入的不是數字,不合法,則提示繼續輸入數字
                                          當變數為空時繼續往下執行,說明輸入的是數字
then
     echo "Please input a number."     //繼續提示輸入數字
     exit 1                            //繼續退出來,返回一個數值 1
#elif [ $n -lt 0 ] || [ $n -gt 100 ]
#then 
#     echo "Then number range is 0-100."
#     exit 1
fi
if [ $n -lt 60 ]
then 
      tag=1
elif [ $n -ge 60 ] && [ $n -lt 80 ]
then 
      tag=2
elif [ $n -ge 80 ] && [ $n -lt 90 ]
then 
      tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ]
then
      tag=4
else
      tag=0
fi
case $tag in
        1)
        echo " 不及格"
        ;;
        2)
        echo "及格"
        ;;
        3)
        echo "良好"
        ;;
        4)
        echo "優秀"
        ;;
        *)
        echo "The number range is 0-100."
        ;;
esac




# read -p " Please input a number: "n
說明 n 作為捕獲一個變數的名字,使用者輸入什麼數字,那麼這個n 就會賦值什麼數字,這就是read -p 的作用

演示:
[[email protected] sbin]# read -p " Please input a number: " n
 Please input a number: 100
[[email protected] sbin]# echo $n
100

[[email protected] sbin]# read -p " Please input a number: " n
 Please input a number: 800
[[email protected] sbin]# echo $n
800


#執行,輸入數字90
[[email protected] sbin]# sh -x case.sh 
+ read -p ' Please input a number: ' n
 Please input a number: 90
+ '[' -z 90 ']'        //判斷 90 變數是否存在
++ sed 's/[-0-9]//g'   // $n1 清空 
++ echo 90
+ n1=                  //$n1 為空
+ '[' '!' -z ']'       // 判斷是否不為空,不為空說明正常,往下匹配
+ '[' 90 -lt 60 ']'
+ '[' 90 -ge 60 ']'
+ '[' 90 -lt 80 ']'
+ '[' 90 -ge 80 ']'
+ '[' 90 -lt 90 ']'
+ '[' 90 -ge 90 ']'
+ '[' 90 -le 100 ']'
+ tag=4               //匹配到了第4個條件
+ case $tag in
+ echo $'\344\274\230\347\247\200'
優秀



# 執行,輸入非數字,就會提示請輸入數字
[[email protected] sbin]# sh -x case.sh 
+ read -p ' Please input a number: ' n
 Please input a number: gsagas
+ '[' -z gsagas ']'        //判斷 gsagas 變數是否存在
++ sed 's/[-0-9]//g'       //清空$n1 所有數字
++ echo gsagas
+ n1=gsagas                //$n1不為空,所以輸入的不是數字有問題
+ '[' '!' -z gsagas ']'
+ echo 'Please input a number.' 
Please input a number.       //提示請輸入數字
+ exit 1