Shell編程-07-Shell中條件測(cè)試與比較

Shell腳本條件測(cè)試

? ? 在Shell腳本中各種條件結(jié)構(gòu)和流程控制結(jié)構(gòu)中會(huì)存在各種判斷比較溉卓,然后根據(jù)不同的判斷結(jié)果執(zhí)行不同的操作或命令昔榴,返回的結(jié)果通常為真或假绽族。常見的條件測(cè)試如下所示:

  • 條件測(cè)試-1
test <測(cè)試表達(dá)式>

利用test命令進(jìn)行條件測(cè)試表達(dá)式卖怜,test命令和表達(dá)式中間至少有一個(gè)空格

  • 條件測(cè)試-2
[ <測(cè)試表達(dá)式> ]

利用[]進(jìn)行條件測(cè)試的方法键思,表達(dá)式與[]前后均需要有至少一個(gè)空格

  • 條件測(cè)試-3
[[ <測(cè)試表達(dá)式> ]]

利用[ [ ] ]進(jìn)行條件測(cè)試的方法础爬,表達(dá)式與[ [ ] ]前后均需要有至少一個(gè)空格

  • 條件測(cè)試-4
((<測(cè)試表達(dá)式>))

利用(())進(jìn)行條件測(cè)試的方法,表達(dá)式與(())前后不需要有空格,一般用于if語句

以上幾種用法的注意事項(xiàng)如下所示:

  • 1吼鳞、test命令和[]功能是等價(jià)的
  • 2看蚜、[[]]是test命令的擴(kuò)展
  • 3、(())常用于計(jì)算
  • 4赔桌、[[]]可以使用通配符進(jìn)行模式匹配
  • 5供炎、&&、||疾党、<音诫、>等操作符可以用在[[]],但不能用在[]中雪位,在[]中一般用-a竭钝、-o、-gt雹洗、-lt等進(jìn)行代替

test條件測(cè)試

? 其基本語法如下所示:

test <測(cè)試表達(dá)式>

? 示例如下所示:

[root@localhost Test]# test -f para.sh && echo true || echo false
true
[root@localhost Test]# test -f para && echo true || echo false
false

以上命令用于測(cè)試文件是否為普通文件或文件是否存在香罐,如果是則輸出true,否則輸出false

[]條件測(cè)試

? 其基本語法如下所示:

[ <測(cè)試表達(dá)式> ]

? []與test功能是等價(jià)的队伟,即test的所有判斷選項(xiàng)均可以直接在[]中使用穴吹。示例如下所示:

[root@localhost Test]# [ -f para.sh ] && echo true || echo false
true
[root@localhost Test]# [ -f para ] && echo true || echo false
false

以上注意表達(dá)式與[]間的空格

[[]]條件測(cè)試

? 其基本語法如下所示:

[[ <測(cè)試表達(dá)式> ]]

? 其示例如下所示:

[root@localhost Test]# [[ -f para.sh ]] && echo true || echo false
true
[root@localhost Test]# [[ -f para ]] && echo true || echo false
false

以上注意表達(dá)式與[[]]間的空格

- 1、以上幾種用法嗜侮,推薦采用[]寫法港令,其他三種了解即可
- 2、如需查看更詳細(xì)的用法锈颗,可以使用man 進(jìn)行查看

Shell文件測(cè)試

常用文件測(cè)試表達(dá)式

? 如果在編寫腳本時(shí)需要操作一個(gè)對(duì)象顷霹,需要先對(duì)對(duì)象進(jìn)行測(cè)試,在滿足條件后才會(huì)進(jìn)行相應(yīng)的操作或命令击吱,從而避免程序出錯(cuò)和資源浪費(fèi)淋淀。操作的對(duì)象通常為文件、字符串和數(shù)字等覆醇,常見的文件測(cè)試表達(dá)式如下所示:

文件操作符 英文含義 含義
-b FILE block 文件存在且為塊設(shè)備文件則為真
-c FILE character 文件存在且為字符設(shè)備文件則為真
-d FILE directory 文件夾存在則為真
-f FILE file 文件存在且為普通文件則為真
-e FILE exist 文件存在即為真朵纷,不區(qū)分文件或文件夾
-L FILE symbolic link 文件存在且為鏈接文件則為真
-O FILE owner 文件存在且屬主有有效的UID則為真
-G FILE group 文件存在且屬組有有效的GID則為真
-r FILE read 文件存在且具備可讀權(quán)限則為真
-s FILE size 文件存在且文件大小大于0則為真
-w FILE write 文件存在且具備可寫權(quán)限則為真
-x FILE executable 文件存在且具備可執(zhí)行權(quán)限則為真
FILE1 -ef FILE2 equal FILE1和FILE2擁有同樣的設(shè)備和inode number則為真
FILE1 -nt FILE2 new than FILE1的修改日期比FILE2新則為真
FILE1 -ot FILE2 older than FILE1的修改日期比FILE2舊則為真

以上更詳細(xì)信息可使用命令man test進(jìn)行查看炭臭。

文件測(cè)試表達(dá)式示例

[root@localhost Test]# [ -d ~/Test ] && echo true || echo false
true      # 判斷文件是否為文件夾
[root@localhost Test]# [ -e ~/Test/eval.sh ] && echo true || echo false
true      # 判斷文件是否存在
[root@localhost Test]# [ -e ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在
[root@localhost Test]# [ -O ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在且套上有效的UID
[root@localhost Test]# [ -G ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在且套上有效的GID
[root@localhost Test]# ll -d ~/Test/
drwxr-xr-x 2 root root 123 11月  1 17:47 /root/Test/ # 顯示文件信息
[root@localhost Test]# [ -r ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在及可讀權(quán)限
[root@localhost Test]# [ -w ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在及可寫權(quán)限
[root@localhost Test]# [ -x ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在及可執(zhí)行權(quán)限
[root@localhost Test]# stat eval.sh exec.sh
  文件:"eval.sh"
  大小:68         塊:8          IO 塊:4096   普通文件
設(shè)備:802h/2050d   Inode:21590       硬鏈接:1
權(quán)限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近訪問:2018-11-01 17:32:31.559464328 +0800
最近更改:2018-11-01 17:32:19.712464490 +0800
最近改動(dòng):2018-11-01 17:32:19.713464490 +0800
創(chuàng)建時(shí)間:-
  文件:"exec.sh"
  大信鄞恰:89         塊:8          IO 塊:4096   普通文件
設(shè)備:802h/2050d   Inode:21589       硬鏈接:1
權(quán)限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近訪問:2018-11-01 17:41:17.316457156 +0800
最近更改:2018-11-01 17:40:33.361457755 +0800
最近改動(dòng):2018-11-01 17:40:33.361457755 +0800
創(chuàng)建時(shí)間:-
[root@localhost Test]# [ eval.sh -ef exec.sh ] && echo true || echo false
false      # 判斷文件是否存在相同的設(shè)備和inode number
[root@localhost Test]# [ eval.sh -nt exec.sh ] && echo true || echo false
false      # 判斷文件eval.sh修改日期是否比文件exec.sh新
[root@localhost Test]# [ eval.sh -ot exec.sh ] && echo true || echo false
true      # 判斷文件eval.sh修改日期是否比文件exec.sh舊

[root@localhost Test]# echo $centos
        # 變量未定義
[root@localhost Test]# [ -f $centos ] && echo true || echo false
true    # 變量未定義鞋仍,卻返回true,邏輯不符
[root@localhost Test]# [ -f "$centos" ] && echo true || echo false
false   # 添加引號(hào)后搅吁,邏輯正確

注意事項(xiàng)如下:

1威创、在判斷文件的讀寫執(zhí)行權(quán)限,不單單是看文件rwx屬性谎懦,還要根據(jù)當(dāng)前測(cè)試的用戶是否也具備相應(yīng)的操作權(quán)限
2肚豺、在使用[]進(jìn)行判斷時(shí),需要注意雙引號(hào)特殊用法

Shell字符測(cè)試

常用字符測(cè)試表達(dá)式

? ?字符測(cè)試常用于判斷字符是否相同界拦,長(zhǎng)度是否為零吸申、字符是否為空等,常見的字符測(cè)試如下所示:

字符操作符 英文含義 含義
-n STRING nonzero 字符串長(zhǎng)度不為零寞奸,則為真
-z STRING zero 字符串長(zhǎng)度為零呛谜,則為真
STRING1 = STRING2 STRING1和STRING2是相等在跳,則為真
STRING1 != STRING2 STRING1和STRING2是不相等枪萄,則為真

字符測(cè)試注意事項(xiàng):

1、字符測(cè)試中一定要添加雙引號(hào)
2猫妙、比較符號(hào)的兩端一定要添加空格

字符測(cè)試表達(dá)式示例

[root@localhost Test]# [ -n "Test" ] && echo true || echo false
true
[root@localhost Test]# [ -z "Test" ] && echo true || echo false
false
[root@localhost Test]# [ "Test" = "Test" ] && echo true || echo false
true
[root@localhost Test]# [ "Test" != "Test" ] && echo true || echo false
false
[root@localhost Test]# [ -z "" ] && echo true || echo false
true

Shell整數(shù)測(cè)試

常用整數(shù)測(cè)試表達(dá)式

[]/test比較符號(hào) 英文含義 ( ( ) )/[ [ ] ]比較符號(hào)
-eq equal ==/=
-ge greater than or equal >=
-gt greater than >
-le less than or equal <=
-lt less than <
-ne not equal !=

整數(shù)測(cè)試表達(dá)式注意事項(xiàng)如下所示:

1瓷翻、=和!=也可以用在[]中進(jìn)行比較,但在[]中使用< 和 > 時(shí)割坠,需要進(jìn)行轉(zhuǎn)義齐帚,否則結(jié)果會(huì)出現(xiàn)不正確的情況
2、比較符號(hào)兩端需要添加空格

整數(shù)測(cè)表達(dá)式示例

[root@localhost ~]# [ 8 > 4 ] && echo true || echo false
true
[root@localhost ~]# [ 4 > 8 ] && echo true || echo false
true            # 未進(jìn)行轉(zhuǎn)義時(shí)彼哼,結(jié)果輸出存在錯(cuò)誤
[root@localhost ~]# [ 4 \> 8 ] && echo true || echo false
false           # 進(jìn)行轉(zhuǎn)義后对妄,結(jié)果輸出正確
[root@localhost ~]# [ 8 != 8 ] && echo true || echo false
false
[root@localhost ~]# [ 8 == 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 = 8 ] && echo true || echo false
true
[root@localhost ~]# [ 4 -gt 8 ] && echo true || echo false
false
[root@localhost ~]# [ 4 -lt 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 -eq 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 -ne 8 ] && echo true || echo false
false
[root@localhost ~]# [[ 8 -ne 8 ]] && echo true || echo false
false
[root@localhost ~]# [[ 8 != 8 ]] && echo true || echo false
false
[root@localhost ~]# (( 8 != 8 )) && echo true || echo false
false
[root@localhost ~]# (( 8 == 8 )) && echo true || echo false
true
[root@localhost ~]# a=90;b=97 # 通過變量傳遞進(jìn)行比較
[root@localhost ~]# [ $a -gt $b ] && echo true || echo false
false
[root@localhost ~]# [ $a -le $b ] && echo true || echo false
true

在使用整數(shù)比較時(shí),需要注意數(shù)字必須是整數(shù)敢朱,否則會(huì)出現(xiàn)報(bào)錯(cuò)剪菱。[]與(())區(qū)別如下所示:

[ number1 -lt number2 ] # 比較運(yùn)算符兩端和[]間必須有空格
((number1<number2)) # (())無空格要求

Shell邏輯測(cè)試

常用邏輯測(cè)試表達(dá)式

[]/test比較符號(hào) 英文含義 ( ( ) )/[ [ ] ]比較符號(hào)
-a and &&
-o or ||
! not !

在以上邏輯測(cè)試結(jié)果中

  • 1:代表結(jié)果為真True
  • 0:代表結(jié)果為假False
  • -a和-o僅適用于[],不能用在[[]]
  • []和[ [] ]兩端必須有空格拴签,( ( ) )無此要求

邏輯測(cè)試表達(dá)式示例

[root@localhost ~]# [ 8>7 -a 9>2 ] && echo true || echo false
true
[root@localhost ~]# [ 8>7 -o 9>2 ] && echo true || echo false
true
[root@localhost ~]# [ 8>7 -o 9>21 ] && echo true || echo false
true
[root@localhost ~]# [  ! 9>21 ] && echo true || echo false
true
[root@localhost ~]# [ -f /etc/hosts -a /etc/passwd ] && echo true || echo false
true
[root@localhost ~]# a="/etc/hosts";b="/etc/passwd"
[root@localhost ~]# [ -f $a -o -f $b ] && echo true || echo false
true
[root@localhost ~]# [ -f "$a" ] && [ -f "$b" ] && echo true || echo false
true
[root@localhost ~]# [ -f $a ] && [ -f $b ] && echo true || echo false
true
[root@localhost ~]# [[ -f $a -a  -f $b ]] && echo true || echo false
-bash: 條件表達(dá)式中有語法錯(cuò)誤
-bash: `-a' 附近有語法錯(cuò)誤
[root@localhost ~]# [[ -f $a &&  -f $b ]] && echo true || echo false
true

Shell條件測(cè)試總結(jié)

測(cè)試表達(dá)式符號(hào) [ ] test [ [ ] ] ( ( ) )
邊界是否需要空格 需要 需要 需要 不需要
邏輯操作符 -a/-o/! -a/-o/! &&/||/! &&/||/!
整數(shù)比較符 -eq/-ge/-gt/-le/-lt/-ne -eq/-ge/-gt/-le/-lt/-ne -eq/-ge/-gt/-le/-lt/-ne或=/>=/>/<=/</!= =/>=/>/<=/</!=
字符串比較符 =/==/!= =/==/!= =/==/!= =/==/!=
是否支持通配符 不支持 不支持 支持 不支持
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末孝常,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蚓哩,更是在濱河造成了極大的恐慌构灸,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岸梨,死亡現(xiàn)場(chǎng)離奇詭異喜颁,居然都是意外死亡稠氮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門半开,熙熙樓的掌柜王于貴愁眉苦臉地迎上來括袒,“玉大人,你說我怎么就攤上這事稿茉∏旅蹋” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵漓库,是天一觀的道長(zhǎng)恃慧。 經(jīng)常有香客問我,道長(zhǎng)渺蒿,這世上最難降的妖魔是什么痢士? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮茂装,結(jié)果婚禮上怠蹂,老公的妹妹穿的比我還像新娘。我一直安慰自己少态,他們只是感情好城侧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彼妻,像睡著了一般嫌佑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侨歉,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天屋摇,我揣著相機(jī)與錄音,去河邊找鬼幽邓。 笑死炮温,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牵舵。 我是一名探鬼主播柒啤,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼棋枕!你這毒婦竟也來了白修?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤重斑,失蹤者是張志新(化名)和其女友劉穎兵睛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祖很,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年笛丙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片假颇。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胚鸯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笨鸡,到底是詐尸還是另有隱情姜钳,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布形耗,位于F島的核電站哥桥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏激涤。R本人自食惡果不足惜拟糕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倦踢。 院中可真熱鬧送滞,春花似錦、人聲如沸辱挥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽般贼。三九已至愧哟,卻和暖如春奥吩,著一層夾襖步出監(jiān)牢的瞬間哼蛆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工霞赫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腮介,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓端衰,卻偏偏與公主長(zhǎng)得像叠洗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旅东,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,378評(píng)論 0 5
  • 一灭抑、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,734評(píng)論 0 10
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)抵代,斷路器腾节,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • 之前看過心藍(lán)老師畫的寫意花卉,都覺得很仙很神奇。聽了老師的分享課案腺,手癢也想畫一朵奇葩庆冕。 奇葩這個(gè)詞,怎么就有了貶義...
    喵三娘stella閱讀 530評(píng)論 4 47
  • 在一個(gè)叫和平年代的國(guó)度劈榨,生活著眾多優(yōu)良國(guó)民访递。然而這個(gè)世界沒有絕對(duì)的和平,零硝煙只是個(gè)美麗的傳說同辣。所以國(guó)家需要對(duì)付罪...
    Azadzad閱讀 826評(píng)論 0 0