[Shell]條件判斷 和 if語句


一、條件測試操作

要使Shell腳本程序具備一定的“智能”,面臨的第一個問題就是如何區分不同的情況以確定執行何種操作。Shell環境根據命令執行后的返回狀態值($?)來判斷是否執行成功,當返回值為0時表示成功,否則(非0值)表示失敗或異常。使用專門的測試工具——test命令,可以對特定條件進行測試,並根據返回值來判斷條件是否成立(返回值為0表示條件成立)。

使用test測試命令時,包括以下兩種形式:

test 條件表達式
[ 條件表達式 ]

這兩種方式的作用完全相同,但通常后一種形式更為常用,需要注意的是,方括號“[“ 或 ”]”與條件表達式之間需要至少一個空格進行分隔。

第1種方式:

 

bogon:~ xxx$ test 2 -eq 1
bogon:~ xxx$ echo $?
1

 第2種方式: 

bogon:~ xxx$ [ 1=1 ]
bogon:~ xxx$ echo $?
0

 

1、文件測試:

-d:測試是否為目錄(Directory);

-e:測試文件或目錄是否存在(Exist);

-f:測試是否為文件(File);

-r:測試當前用戶是否有權限讀取(Read);

-w:測試當前用戶是否有權限寫入(Write);

-x:測試是否設置有可執行(Excute)權限;

執行條件測試操作以后,通過預定義變量$?可以獲得測試命令的返回狀態值,從而判斷該條件是否成立。

首先,使用ls命令查看一下當前目錄下都有哪些文件,可以看到Music目錄存在

wangju@wangju-HP-348-G4:~$ ls baidunetdisk Documents Music PycharmProjects baidunetdiskdownload Downloads Pictures snap Desktop examples.desktop Public Videos

執行以下操作可以測試目錄~/Music/是否存在,如果返回值$?為0,表示存在此目錄,否則表示不存在或者雖然存在但不是目錄。

wangju@wangju-HP-348-G4:~$ test -d ~/Music   <!--測試目錄是否存在--> wangju@wangju-HP-348-G4:~$ echo $? <!--查看前一命令的返回值-->
0  <!--返回0表示條件成立-->

若測試的條件不成立,則測試操作的返回值將不為0(通常為1).

wangju@wangju-HP-348-G4:~$ test -d ~/aaa <!--測試目錄是否存在--> wangju@wangju-HP-348-G4:~$ echo $? <!--查看前一命令的返回值-->
1    <!--返回1表示條件不成立-->

2、整數值比較:

-eq:第一個數等於(Equal)第二個數;

-ne:第一個數不等於(Not Equal)第二個數;

-gt:第一個數大於(Greater Than)第二個數;

-lt:第一個數小於(Lesser Than)第二個數;

-le:第一個數小於或等於(Lesser or Equal)第二個數;

-ge:第一個數大於或等於(Greater or Equal)第二個數;
整數值比較在Shell腳本編寫中的應用較多。例如,用來判斷已登錄用戶數量、開啟進程數、磁盤使用率是否超標,以及軟件版本號是否符號要求等。實際 使用時,往往會通過變量引用、命令替換等方式來獲取一個數值。

 示例:
wangju@wangju-HP-348-G4:~$ test 2 -eq 1 <!--測試2等於--> wangju@wangju-HP-348-G4:~$ echo $?<!--查看命令返回值-->
1<!--返回1表示條件不成立--> wangju@wangju-HP-348-G4:~$ test 1 -eq 1 wangju@wangju-HP-348-G4:~$ echo $?
0<!--返回0表示條件成立-->

 3、字符串比較:

=:第一個字符串與第二個字符串相同。

!=:第一個字符串與第二個字符串不相同,其中 “ !”表示取反

-z:檢查字符串是否為空,對於未定義或賦予空值的變量將視為空串。

wangju@wangju-HP-348-G4:~$ a=1 wangju@wangju-HP-348-G4:~$ b=2 wangju@wangju-HP-348-G4:~$ [ $a = $b ] && echo "yes" <!--當1等於2顯示yes,不等於顯示為空-->
  <!--顯示為空--> wangju@wangju-HP-348-G4:~$ [ $a != $b ] && echo "yes"  <!--當1不等於2顯示yes,否則顯示為空--> yes <!--1不等於2,顯示yes-->

注意,方括號“[“ 或 ”]”與條件表達式之間需要至少一個空格進行分隔。

 

否則會報command not found錯誤

wangju@wangju-HP-348-G4:~$ [$a!=$b] && echo "yes" [1!=2]: command not found

注意:[ var1 = var2 ] var1 , var2和 = 之間有1個空格,否則條件都為真

 

a=1
b=2
[ $a=$b ] && echo "yes"
yes #結果顯示yes 表示條件成立

 

判斷字符品串是否為空

wangju@wangju-HP-348-G4:~$ test -z "" wangju@wangju-HP-348-G4:~$ echo $?
0<!--返回0表示條件成立,即被測字符串為空-->
wangju@wangju-HP-348-G4:~$ test -z "abc" wangju@wangju-HP-348-G4:~$ echo $? 1

測試變量a被正確的定義,且已經被賦值

wangju@wangju-HP-348-G4:~$ a="2" wangju@wangju-HP-348-G4:~$ test -z $a wangju@wangju-HP-348-G4:~$ echo $?
1<!--返回1表示變量值存在-->

使用test方式,測試變量mmm不存在

wangju@wangju-HP-348-G4:~$ test -z $mmm wangju@wangju-HP-348-G4:~$ echo $?
0<!--返回0表示條件成立,變量mmm不存在,被視為1個空串->

使用[ 條件表達式 ] 方式,測試mmm不存在

wangju@wangju-HP-348-G4:~$ [ -z $mmm ] && echo "is empty string" is empty string

 4、邏輯測試:

  • &&:邏輯與,表示“而且”,只有當前后兩個條件都成立時,整個測試命令的返回值才為0(結果成立),使用test命令測試時,“&&”可以使用“-a”代替。
  • ||:邏輯或,表示“或者”,只要前后兩個條件有一個成立,整個測試命令返回的值即為0(結果成立)。使用test命令測試時可以使用“-o”代替。
  • !:邏輯否,表示“不”,只有當條件不成立時,整個測試命令返回的值才為0(結果成立)。

注意,現在shell已經不再把"!"作為邏輯運算符,所以這種格式的邏輯判斷不能用了 [ ! 條件表達式 ] ,會報錯:command not found

wangju@wangju-HP-348-G4:~$ [ ! 1=2 ] wangju@wangju-HP-348-G4:~$ $?
1: command not found

但是可以和等號結合起來使用,  !=

wangju@wangju-HP-348-G4:~$ [ 1!=1 ] && echo "yes" yes

邏輯與

wangju@wangju-HP-348-G4:~$ [ $a=100 ] && [ $a!=50 ] && echo "yes"<!--使用邏輯與運算,兩個條件為真顯示yes--> yes <!--兩個條件為真,顯示yes-->

邏輯或

wangju@wangju-HP-348-G4:~$ [ $a=100 ] || [ $a=50 ] && echo "yes"<!--使用邏輯與運算,兩個條件一個為真顯示為yes--> yes <!--兩個條件一個為真,顯示yes-->

 if分支語句

1、單分支if語句

if語句的“分支”指的是不同測試結果所對應的執行語句(一條或多條)。對於單分支的選擇結構,只有在“條件成立”時才會執行相應的代碼,否則不會執行任何操作。單分支if語句的語法格式如下所示:

 

wangju@wangju-HP-348-G4:~$ cd ppp <!--驗證目錄是否存在--> bash: cd: ppp: No such file or directory <!--ppp目錄不存在-->

 

使用nano命令,創建if_dan.sh腳本

創建/home/wangju/ppp目錄

nano if_dan.sh

if_dan.sh內容如下:

#!/bin/bash<!--腳本聲明-->
mount="/home/wangju/ppp"<!--定義一個變量-->
if [ ! -d $mount ]<!--測試條件-->
then<!--如果滿足則執行下面的命令-->
        mkdir -p $mount
fi <!--if語句結束-->

執行腳本,效果如下:

chmod +x if_dan.sh <!--添加權限--> ./if_dan.sh     <!--執行腳本自動創建--> cd ppp/ <!--查看目錄是否創建成功--> wangju@wangju-HP-348-G4:~$ cd ppp wangju@wangju-HP-348-G4:~/ppp$ pwd<!--目錄已創建成功-->
/home/wangju/ppp

  這里注意一下mount變量值,目錄的寫法

正確:/home/wangju/ppp

錯誤:~/ppp

#!/bin/bash
mount="~/ccc"
if [ ! -d $mount ]
then
        mkdir -p $mount
fi

執行效果:

會生成一個文件夾,但是文件名是'~',並不是我期待的ccc

 記切記 不要執行rm -rf ~命令,會把你home目錄下的所有文件都刪除掉的,不要問我怎么知道的

2 雙分支if語句

執行過程:

 

 pinghost.sh腳本內容如下:

#!/bin/bash ping -c 3 -i 0.2 -W 3 $1 &>/dev/null #ping 3次,間隔0.2秒,超時3秒,$1為位置變量 if [ $? -eq 0 ] #測試條件為前一條的命令執行結果 then #如果成功,則執行以下命令 echo "主機${1}當前狀態為up"
else #若不成功,則執行以下命令 echo "主機${1}當前狀態為down" fi

為pinghost.sh增加 執行權限

chmod +x pinghost.sh 

 執行pinghost.sh

wangju@wangju-HP-348-G4:~$ ./pinghost.sh 10.2.1.92 #能ping通的ip地址 主機10.2.1.92當前狀態為up wangju@wangju-HP-348-G4:~$ ./pinghost.sh 10.2.1.92324 #不能ping通的ip地址 主機10.2.1.92324當前狀態為down

3、多分支if語句:

執行過程:

 

 

 多分支if語句示例:

#!/bin/bash read -p "請輸入您的分數:" grade if [ $grade -ge 85 ] && [ $grade -le 100 ] then echo "${grade}分,優秀!" elif [ $grade -ge 70 ] &&[ $grade -le 84 ] then echo "${grade}分,及格"
else echo "${grade}分,不及格" fi

執行gradediv.sh,效果如下:

wangju@wangju-HP-348-G4:~$ ./gradediv.sh 請輸入您的分數:11 11分,不及格 wangju@wangju-HP-348-G4:~$ ./gradediv.sh 請輸入您的分數:88 88分,優秀! wangju@wangju-HP-348-G4:~$ ./gradediv.sh 請輸入您的分數:77 77分,及格

 

 應用:

以2種方式拉取git分支:

如果手動填充分支名,則以手動填充為准,否則使用下拉框中選擇的分支名稱

 

 

 

腳本:

 

#判斷${Branch_handle}是否為空,如果為空,則使用下拉框的值,否則使用手動輸入的分支
if [ -z ${Branch_handle}]
then
    branch_ck=$(echo ${Branch} | awk -F "/" '{print $2}')
else
    branch_ck=${Branch_handle}
fi

Branch=${branch_ck}
git checkout ${branch_ck}

#顯示當前所在分支
git branch

#拉取最新代碼
git pull origin ${branch_ck}:${branch_ck}

 

 

 

 

參考文檔:

Shell 基本運算符

Shell腳本的條件測試和if條件語句使用方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM