一、條件測試操作
要使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}
參考文檔: