shell腳本中的邏輯判斷&文件目錄屬性判斷&if特殊用法&case判斷

20.5 shell腳本中的邏輯判斷

shell腳本中邏輯判斷通常使用if語句,其中if能夠理解爲「若是」,then能夠理解爲「而後」,else能夠理解爲「不然」,fi爲if語句結束的標誌mysql

邏輯判斷表達式的書寫格式

if [ $a -gt $b ]; 
if [ $a -lt 5 ]; 
if [ $b -eq 10 ]等 
語句後的邏輯表達式須要用方括號【】括起來,注意處處都是空格,語句與方括號之間,方括號與表達式變量之間,變量與變量之間均須要用空格進行間隔

-gt 表明大於號(>); -lt表明小於號(<);linux

-ge表明大於等於號(>=); -le表明小於等於號(<=);sql

-eq表明等於號(==); -ne表明不等於號(!=)shell

if語句的第一種格式

if 條件 ; then 語句; fi
[root@linux-5 shell]# cat 01.sh
#!/bin/bash
a=4
if [ $a -gt 3 ]
then 
   echo ok
fi
[root@linux-5 shell]# sh 01.sh
ok

if語句的第二種格式

if 條件; then 語句; else 語句; fi
[root@linux-5 shell]# cat 01.sh
#!/bin/bash
a=2
if [ $a -lt 1 ]
then 
   echo ok
else 
   echo not ok
fi
[root@linux-5 shell]# sh -x 01.sh
+ a=2
+ '[' 2 -lt 1 ']'
+ echo not ok
not ok

if語句的第三種格式

if …; then … ;elif …; then …; else …; fi
[root@linux-5 shell]# cat 01.sh
#!/bin/bash
a=3
if [ $a -lt 1 ]
then 
   echo ok
elif [ $a -gt 5 ]
then
   echo okk
else 
   echo not ok
fi
[root@linux-5 shell]# sh -x 01.sh
+ a=3
+ '[' 3 -lt 1 ']'
+ '[' 3 -gt 5 ']'
+ echo not ok
not ok

還可使用&& || 結合多個條件vim

if [ $a -gt 5 ] && [ $a -lt 10 ]; then
if [ $b -gt 5 ] || [ $b -lt 3 ]; then

20.6 文件目錄屬性判斷

if語句常和文件或目錄屬性相結合,進行判斷,並對文件目錄屬性執行相關操做bash

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

示例

檢查/tmp/目錄下lem123456文件是否存在,若是存在打印結果,不存在則建立該文件spa

[ -f file ]判斷是不是普通文件,且存在

[root@linux-5 shell]# cat !$
cat 02.sh
#!/bin/bash
f=/tmp/lem123456
if [ -f $f ]
then 
    echo $f exist
else
    touch $f
fi
[root@linux-5 shell]# sh -x 02.sh    ##第一次執行,會建立該文件
+ f=/tmp/lem123456
+ '[' -f /tmp/lem123456 ']'
+ touch /tmp/lem123456
[root@linux-5 shell]# ls /tmp
lem123456       
[root@linux-5 shell]# sh -x 02.sh    ##第二次執行,會提示該文件已存在
+ f=/tmp/lem123456
+ '[' -f /tmp/lem123456 ']'
+ echo /tmp/lem123456 exist
/tmp/lem123456 exist

文件是能夠touch 的,touch的目的是,若是這個文件或目錄不存在,它會建立這個文件(建立目錄則用mkdir),若是這個文件或目錄存在了,再touch就會更改這個文件的三個time3d

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

[root@linux-5 shell]# cat !$
cat 02.sh
#!/bin/bash
f=/tmp/lem123456
if [ -d $f ]
then 
    echo $f exist
else
    mkdir $f
fi
[root@linux-5 shell]# sh -x 02.sh
+ f=/tmp/lem123456
+ '[' -d /tmp/lem123456 ']'
+ mkdir /tmp/lem123456
[root@linux-5 shell]# sh -x 02.sh
+ f=/tmp/lem123456
+ '[' -d /tmp/lem123456 ']'
+ echo /tmp/lem123456 exist
/tmp/lem123456 exist

[ -e file ] 判斷文件或目錄是否存在

[root@linux-5 shell]# cat 02.sh
#!/bin/bash
f=/tmp/lem123456
if [ -e $f ]
then 
    echo $f exist
else
    mkdir $f
fi
[root@linux-5 shell]# sh 02.sh
/tmp/lem123456 exist

[ -r file ] 判斷文件是否可讀

#!/bin/bash
f=/tmp/lem123456
if [ -r $f ]
then 
    echo $f read
fi
[root@linux-5 shell]# sh 02.sh
/tmp/lem123456 read

[ -w file ] 判斷文件是否可寫

[root@yong-01 shell]# vim file4.sh

#! /bin/bash
f="/tmp/yongge"
if [ -w $f ]
then
        echo $f writeadable
fi
[root@yong-01 shell]# sh file4.sh 
/tmp/yongge writeadable

[ -x file ] 判斷文件是否可執行

[root@linux-5 shell]# cat 02.sh
#!/bin/bash
f=/tmp/lem123456
if [ -x $f ]
then 
    echo $f exe
fi
[root@linux-5 shell]# sh 02.sh
/tmp/lem123456 exe

注:判斷是否可讀可寫可執行,判斷的是當前執行shell腳本的用戶的權限code

判斷語句與邏輯符號結合

而且 &&

[ -f $f ] && rm -f $f     //前一條命令執行成功纔會繼續執行以後的命令
等同於下面的表達方式
if [ -f $f ]     
then
      rm -rf $f
fi

或者 ||

if [ -f $f ] || touch $f fi   //前面命令不成功時,執行後面的命令
等同於
if [ -f $f ]
then
    echo exist
else 
    touch $f
fi

取反"!"

if [ ! -f $f ]        //  「!」表示取反,判斷是否不是普通文件,且不存在
then
      touch $f
fi

20.7 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… 
[ ] 中不能使用<,>,==,!=,>=,<=這樣的符號
!-z=-n
!-n=-z

注:if -z或者if -n 都不能做用在文件上,只能做用在變量上。blog

示例

if [ -z "$a" ]

[root@linux-5 shell]# cat 03.sh
#!/bin/bash
n=`wc -l /tmp/lalala`
if [ -z $n ]
then 
    echo error
fi
[root@linux-5 shell]# sh -x 03.sh
++ wc -l /tmp/lalala
wc: /tmp/lalala: 沒有那個文件或目錄
+ n=
+ '[' -z ']'
+ echo error
error

if [ -n "$a" ]

[root@linux-5 shell]# cat 03.sh
#!/bin/bash
n=`wc -l /tmp/lalala`
if [ -n "$n" ]
then 
    echo ok
else
    echo error
fi
[root@linux-5 shell]# sh -x 03.sh
++ wc -l /tmp/lalala
wc: /tmp/lalala: 沒有那個文件或目錄
+ n=
+ '[' -n '' ']'
+ echo error
error

注:變量中包含命令須要加反引號``

if語句與grep結合

grep -wq

其中-w爲精確匹配,意爲w後跟一個單詞,而不是包含指定字符串,避免出現須要檢索user1卻檢索出user1和user11的狀況,-q僅僅作一個過濾,而不顯示過濾的內容

若是系統進程中含有mysql的進程時會怎麼樣

[root@linux-5 shell]# cat 03.sh
#!/bin/bash
if ps aux|grep -wq '3306'
then 
    echo ok
else
    echo error
fi
[root@linux-5 shell]# sh -x 03.sh
+ grep -wq 3306
+ ps aux
+ echo ok
ok

若是取反則在grep前加入!便可

20.8/20.9 case判斷 

case判斷的格式

示例

該腳本目的是:輸入一個數字,而後用腳本去判斷這個數字的範圍

#!/bin/bash
#判斷是否輸入有數值,空直接結束整個文本
read -p "Please input a number: " n    
#read -p捕獲用戶所輸入的字符串;賦值給最後一個變量;這裏的賦值是「n」
if [ -z "$n" ]                    ##變量n 爲空
then
    echo "Please input a number."
    exit 1   ##結束腳本,返回值1
fi
#n1將輸入的字符串所包含的數字清空,並檢查變量是否爲空,若是不爲空,就證實輸入有其餘的字符,告知用戶,請輸入一個數字
n1=`echo $n|sed 's/[0-9]//g'`   //肯定,n變量是否爲數字
if [ -n "$n1" ]
then
echo "Please input a number."
exit 1
fi

if [ $n -lt 60 ] && [ $n -ge 0 ]
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 "not ok"
        ;;
    2)
         echo "ok"
        ;;
    3)
         echo "okok"
        ;;
    4)
         echo "okokok"
        ;;
    *)
         echo "The number range is 0-100."
        ;;
esac

注:

exit(0):正常運行程序並退出程序;

exit(1):非正常運行致使退出程序;

exit 0 能夠告知你的程序的使用者:你的程序是正常結束的。若是 exit 非 0 值,那麼你的程序的使用者一般會認爲你的程序產生了一個錯誤。在 shell 中調用完你的程序以後,用 echo $? 命令就能夠看到你的程序的 exit 值。在 shell 腳本中,一般會根據上一個命令的 $? 值來進行一些流程控制。

相關文章
相關標籤/搜索