一、條件測試
- Shell 環(huán)境根據(jù)命令執(zhí)行后的返回狀態(tài)值 " $? " 來判斷是否執(zhí)行成功,當(dāng)返回值為0時(shí)表示成功,否則表示失敗或異常(非0值)。
- 使用專門的測試工具 test 命令,可以對(duì)特定條件進(jìn)行測試,并根據(jù)返回值(值為0)來判斷是否成立。
格式1:test 條件表達(dá)式
格式2:[ 條件表達(dá)式 ]
注意[]空格,否則會(huì)失敗
測試 是否成功使用 $? 返回值
[ 操作符 文件或目錄 ]
help test
test命令格式
test 條件表達(dá)式
或
[ 條件表達(dá)式 ] #條件表達(dá)式的兩邊都需要有空格,且此方法更為常用
或
[[ 條件表達(dá)式 ]]
1、文件測試
- 文件測試指的是根據(jù)給定的路徑名稱,判斷對(duì)應(yīng)的是文件還是目錄,或者判斷文件是否可讀、可寫、可執(zhí)行等。
基本格式
[ 操作符 文件或目錄 ] (注意兩端要有空格)
常用的選項(xiàng):
選項(xiàng) | 說明 |
---|---|
-d | 測試是否為目錄 |
-e | 測試目錄或文件是否存在 |
-f | 測試是否為文件 |
-r | 測試當(dāng)前用戶是否有權(quán)限讀取 |
-w | 測試當(dāng)前用戶是否有權(quán)限寫入 |
-x | 測試當(dāng)前用戶是否有權(quán)限執(zhí)行 |
-b | 測試是否為設(shè)備文件 |
-c | 測試是否為字符設(shè)備 |
-s | 測試存在且文件大小為空 |
-L | 測試是否為鏈接文件 |
條件測試:判斷某需求是否滿足,需要由測試機(jī)制來實(shí)現(xiàn),專用的測試表達(dá)式需要由測試命令輔助完成
測試過程,實(shí)現(xiàn)評(píng)估布爾聲明,以便用在條件性環(huán)境下進(jìn)行執(zhí)行
若真,則狀態(tài)碼變量 $? 返回0
若假,則狀態(tài)碼變量 $? 返回1
比較兩個(gè)文件時(shí)常用的選項(xiàng)
-nt:判斷文件A是否比文件B新
-ot:判斷文件A是否比文件B舊
-ef:判斷兩個(gè)文件是否為同一個(gè)文件,用來判斷兩個(gè)文件是否指向同一個(gè)inode。
2、整數(shù)數(shù)值比較
整數(shù)值比較是指根據(jù)給定的兩個(gè)整數(shù)值來判斷第一個(gè)數(shù)與第二個(gè)數(shù)的關(guān)系,如是否大于、等于、小于第二個(gè)數(shù)。
基本格式:
[ 整數(shù)1 -操作符 整數(shù)2 ] 公式
格式 | 說明 |
---|---|
-eq | 第一個(gè)數(shù)等于第二個(gè)數(shù) |
-ne | 第一個(gè)數(shù)不等于第二個(gè)數(shù) |
-gt | 第一個(gè)數(shù)大于第二個(gè)數(shù) |
-lt | 第一個(gè)數(shù)小于第二數(shù) |
-le | 第一個(gè)數(shù)小于或等于第二個(gè)數(shù) |
-ge | 第一個(gè)數(shù)大于或等于第二個(gè)數(shù) |
[root@localhost test]# a=5
[root@localhost test]# b=10
[root@localhost test]# [ $a -eq $b ]
[root@localhost test]# echo $?
1
[root@localhost test]# [ $a -lt $b ]
[root@localhost test]# echo $?
0
[root@localhost test]# [ $a -le $b ]
[root@localhost test]# echo $?
0
3、字符串比較
字符串比較通常用來檢查用戶輸入、系統(tǒng)環(huán)境等是滿足條件,在提供交互式操作的Shell腳本中,也可用來判斷用戶輸入的位置參數(shù)是否符合要求。
格式
[ 字符串1 = 字符串2 ] ##是否相同
[ 字符串1 != 字符串2 ] ##是否不相同
[ -z 字符串 ] ##是否為空
[ -n 字符串 ] ##字符是否存在
常用的操作符
=:第一個(gè)字符串和第二個(gè)字符串相同
!=:第一個(gè)字符串與第二個(gè)字符串不相同,其中“!”符號(hào)表示取反
-z:字符串內(nèi)容為空
[root@localhost test]# str1=liu
[root@localhost test]# str2=yuan
[root@localhost test]# [ $str1 = $str2 ] ##比較是否相同
[root@localhost test]# echo $?
1 ##不相同
[root@localhost test]# [ $str1 != $str2 ] ##比較是否不相同
[root@localhost test]# echo $?
0 ##兩者比較不相同,所以返回值為0,正確
4、邏輯運(yùn)算(短路運(yùn)算)
格式:
格式1:[ 表達(dá)式1 ] 操作符 [ 表達(dá)式2 ] ...
格式2:命令1 操作符 命令2 ...
且? 與? ?或
! 取反
且 &&
第一一個(gè)命令為真,才需要執(zhí)行第二個(gè)命令
全真才為真,一假即為假
第一個(gè)命令假了,一定假了
cmd1 && cmd2
全真才為真 一假即為假
第一個(gè)CMD1結(jié)果為真 ,第二個(gè)CMD2必須要參與運(yùn)算,才能得到最終的結(jié)果
第一個(gè)CMD1結(jié)果為假 ,總的結(jié)果必定為假,因此不需要執(zhí)行CMD2
或 ||
一真即為真,全假才為假
第一個(gè)命令為真,不需要執(zhí)行第二個(gè)命令了, 一定為真了
第一個(gè)命令為假,需要執(zhí)行第二個(gè)命令來看 整個(gè)式子的結(jié)果
cmd1 || cmd2
常見的條件:
-a或&& | 邏輯與,“而且”的意思全真才為真 |
-o或|| | 邏輯或,“或者”的意思一真即為真 |
! | 邏輯否 |
5、雙中括號(hào)
[[ expression ]] 用法
== 左側(cè)字符串是否和右側(cè)的PATTERN相同
注意:此表達(dá)式用于[[ ]]中,PATTERN為通配符
=~ 左側(cè)字符串是否能夠被右側(cè)的正則表達(dá)式的PATTERN所匹配
注意: 此表達(dá)式用于[[ ]]中;擴(kuò)展的正則表達(dá)式
6、()? ? {}
格式:
(CMD1;CMD2;...)和 { CMD1;CMD2;...; } 都可以將多個(gè)命令組合在一起,批量執(zhí)行
#()會(huì)開啟子shell
[root@centos8 ~]#echo $BASHPID
1920
[root@centos8 ~]#( echo $BASHPID;sleep 100)
1979
[root@centos8 ~]#pstree -p
├─sshd(719)───sshd(1906)───sshd(1919)─┬─bash(1920)───bash(1979)───sleep(1980)
#{ } 不會(huì)開啟子shell
[root@centos8 ~]#echo $BASHPID
1920
[root@centos8 ~]#{ echo $BASHPID; }
1920
()表示執(zhí)行過,直接顯示結(jié)果;{}要執(zhí)行操作,也顯示結(jié)果;
()不需要結(jié)尾;{}需要;結(jié)尾;
()會(huì)開啟子進(jìn)程;{}不會(huì)開啟子進(jìn)程
實(shí)操:
1.磁盤使用量
發(fā)郵件
vim mail.sh
#!/bin/bash
use=`df|grep /dev/sda|tr -s " "|cut -d " " -f5| tr -d %`
[ $use -ge 80 ] && echo "磁盤使用量不足" |mail -s warning 224----432@qq.com || echo "磁盤使用量足夠"
bash mail.sh
?
二、if語句
1、單分支if語句
單分支if語句:對(duì)于單分支的選擇結(jié)構(gòu),只有在“條件成立”時(shí)才會(huì)執(zhí)行相應(yīng)的代碼,否則不執(zhí)行任何操作。
語法格式
if 條件測試操作
then
命令序列
fi
2、雙分支if語句
對(duì)于雙分支的選擇結(jié)構(gòu),要求針對(duì)條件成立 條件不成立兩種情況分別執(zhí)行不同的操作。
語法格式
if 條件測試操作
then
命令序列1
else
命令序列2
fi
3、多分支if語句
多分支結(jié)構(gòu)能夠根據(jù)多個(gè)互斥的條件分別執(zhí)行不同的操作,實(shí)際上等同于嵌套使用的if語句。
方式:
if 判斷條件1
then
?條件1為真的分支代碼elif 判斷條件2
then
?條件2為真的分支代碼elif 判斷條件3;then
?條件3為真的分支代碼...
else
?以上條件都為假的分支代碼 ?托底fi
三、case分支
case 語句可以使腳本程序的結(jié)構(gòu)更加清晰、層次分明,常用于服務(wù)的啟動(dòng)、重啟、停止的腳本,有的服務(wù)不提供這種控制腳本,需要用case語句編寫。
case 語句主要適用于以下情況: 某個(gè)變量存在多種取值,需要對(duì)其中的每一種取值分別執(zhí)行不同的命令序列。這種情況與多分支的 if 語句非常相似,只不過 if 語句需要判斷多個(gè) 不同的條件,而 case 語句只是判斷一個(gè)變量的不同取值。
1、case語句結(jié)構(gòu)
case 變量值 in
模式一)
命令序列
;;
模式二)
命令序列
;;
……
*)
默認(rèn)命令序列
esac
2、case注意事項(xiàng)
- case行首必須為單詞 “in”,每一模式必須以單個(gè)右括號(hào)")"結(jié)束。
- 雙分號(hào) “;;” 表示命令序列的結(jié)束。
- 模式字符串中,可以用方括號(hào)表示一個(gè)連續(xù)的范圍,如"[0-9]",還可以用豎杠符號(hào) “|”表示或,如“A|B”。
- 最后的*)表示默認(rèn)模式,其中的 *相當(dāng)于通配符。
- case行首必須為單詞 “in”,每一模式必須以單個(gè)右括號(hào)")"結(jié)束。
- 雙分號(hào) “;;” 表示命令序列的結(jié)束。
- 模式字符串中,可以用方括號(hào)表示一個(gè)連續(xù)的范圍,如"[0-9]",還可以用豎杠符號(hào) “|”表示或,如“A|B”。
- 最后的*)表示默認(rèn)模式,其中的 *相當(dāng)于通配符。
小實(shí)驗(yàn):
石頭剪刀布
雞兔同籠
yes or no
判斷服務(wù)是否開啟
判斷是否安裝
文章來源:http://www.zghlxwxcb.cn/news/detail-824668.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-824668.html
到了這里,關(guān)于Linux系統(tǒng)Shell腳本編程之條件語句的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!