shell編程其實真的很簡單(三)

通過前兩篇文章伟众,我們掌握了shell的一些基本寫法和變量的使用俘枫,以及基本數(shù)據(jù)類型的運算蟹地。那么挫剑,本次就將要學(xué)習(xí)shell的結(jié)構(gòu)化命令了贯莺,也就是我們其它編程語言中的條件選擇語句及循環(huán)語句风喇。

不過,在學(xué)習(xí)shell結(jié)構(gòu)化命令的時候缕探,我們又會發(fā)現(xiàn)它與其它編程的語言相比存在不小的區(qū)別魂莫。下面就開始看看吧:

條件選擇

在條件選擇語句中,主要包含以下幾種寫法:

if-then語句

if command

then

commands

fi

吃瓜群眾表示一臉懵比:if語句后面接的是命令爹耗,我們其它編程語言中耙考,這兒都是接返回布爾值(true,false)的表達(dá)式。

那么這到底是怎么回事呢潭兽?

在shell腳本的if其實是根據(jù)緊跟后面的那個命令的退出狀態(tài)碼來判斷是否執(zhí)行then后面的語句的倦始。

關(guān)于退出狀態(tài)碼,你只需要記咨截浴:正常退出(命令執(zhí)行正常)的狀態(tài)碼是0鞋邑, 非正常退出的狀態(tài)碼不是0(有不少)。

以上語句的語義為: 如果if后面的命令執(zhí)行正常(狀態(tài)碼0)账蓉,那么就執(zhí)行then后面的語句枚碗。否則不執(zhí)行。 fi代表if語句的結(jié)束铸本。

!/bin/bash

這兒由于pwd是linux內(nèi)置的命令肮雨,因此執(zhí)行后會正常退出(狀態(tài)碼0),所以會執(zhí)行then中的語句

如果此處替換為一個不存在的命令(例如: pw)箱玷,那么就會非正常退出怨规,不會執(zhí)行then中的語句

if pwd

then

echo 執(zhí)行then里面的語句

fi

if-then還可以簡寫為

if command; then

commands

fi

因此陌宿,以上代碼還可以寫成以下:

#!/bin/bash

if pwd; then

echo 執(zhí)行then里面的語句

fi

以上,如果我要判斷處理異常退出(狀態(tài)碼非0)情況波丰,該怎么辦限番?

別著急: else 來幫你。

if-then-else語句

if command

then

commands

else

commands

fi

與if-then語句相比呀舔,這回多了個else語句弥虐,else語句用來判斷if后面的命令非正常退出的情況。

#!/bin/bash

if pwd

then

echo 正常退出

else

echo 非正常退出

fi

甚至媚赖,我們還可以變形寫出更多的else:

if command1

then

commands

elif

command2

then

command3

fi

但是上面就只能根據(jù)退出狀態(tài)碼判斷霜瘪,不能寫表達(dá)式,你還讓我怎么寫惧磺? 我各個編程語言直接吊打你颖对!

不要慌,客官磨隘,請接著往下看:

test命令

test命令用于if-then或者if-then-else語句中缤底,主要用于判斷列出的條件是否成立,如果成立番捂,就會退出并返回退出狀態(tài)碼0个唧,否則返回非0。

這意味著我們可以通過test命令來寫表達(dá)式命令了设预。不過徙歼,對于已習(xí)慣其它編程語言的程序猿們(沒學(xué)過的除外),不要高興得太早鳖枕,前方有坑魄梯,至于是什么坑,待會兒就能看到宾符。

先看看test命令的基本用法吧:

直接用:

test condition

結(jié)合if-then語句用

if test condition

then

commands

fi

結(jié)合if-then-else語句用

if test condition

then

commands

else

commands

fi

條件成立就執(zhí)行then語句酿秸,否則else語句。

test命令只能判斷一下三類條件:

  • 數(shù)值比較

  • 字符串比較

  • 文件比較

數(shù)值比較

比較 描述
n1 -eq n2 判斷n1是否等于n2
n1 -ge n2 判斷n1是否大于或等于n2
n1 -gt n2 判斷n1是否大于n2
n1 -le n2 判斷n1是否小于或等于n2
n1 -lt n2 判斷n1是否小于n2
n1 -ne n2 判斷n1是否不等于n2

特別提醒: 以上表格不用你去記住魏烫,在命令行下面, 執(zhí)行man test就能看到這些了辣苏。后面的對與另外兩種比較的同理

#!/bin/bash

num1=100

num2=200

if test $num1 -eq $num2

then

echo num1等于num2

else

echo num2不等于num2

fi

好好的標(biāo)準(zhǔn)的數(shù)學(xué)比較符號不能使用,難道非得寫這種文本形式则奥?是不是覺得很別扭考润?

不著急,還有替代方案:

使用雙括號

雙括號命令允許你在比較過程中使用高級數(shù)學(xué)表達(dá)式读处。關(guān)鍵是使用雙括號糊治,咱就可以用數(shù)學(xué)比較符號啦(等于==, 大于>, 小于< 等等都能使用啦)罚舱。

使用方法:

(( expression ))

注意:括號里面兩邊都需要有空格

#!/bin/bash

num1=100

num2=200

if (( num1 > num2 ))

then

echo "num1 > num2"

else

echo "num2 <= num2"

字符串比較

<colgroup><col><col></colgroup>
| 比較 | 描述 |
| str1 = str2 | 判斷str1是否與str2相同 |
| str1 != str2 | 判斷str1是否與str2不相同 |
| str1 < str2 | 判斷str1是否比str2小(根據(jù)ASCII) |
| str1 > str2 | 判斷str1是否比str2大(根據(jù)ASCII) |
| -n str1 | 判斷str1的長度是否非0 |
| -z str1 | 判斷str1的長度是否為0 |

程序猿們井辜,要罵的就盡情釋放吧绎谦。我反正是罵了。

test命令和測試表達(dá)式使用標(biāo)準(zhǔn)的數(shù)學(xué)比較符號來表示字符串比較,而用文本代碼來表 示數(shù)值比較粥脚。這與其它語言相比都不一樣窃肠。

#!/bin/bash

var1=test

var2=Test

if test $var1 = $str2

then

echo 相等

else

echo 不相等

fi

注意,在使用大于(>)或小于(<)符號時刷允,需要轉(zhuǎn)義(>)(<)冤留,不然會把這兩種符號時別為重定向(后面文章才會講到)。

吐槽模式開啟:我要用個比較符號树灶,還要轉(zhuǎn)義纤怒,很蛋疼的設(shè)計!

不要慌天通,大招一般都在后面:

使用雙方括號

雙方括號命令提供了針對字符串比較的高級特性泊窘。它不僅解決了使用test所帶來的一系列毛病,還提供了一些test命令所沒有的高級用法像寒。雙方括號命令的格式如下:

[[ expression ]]

注意烘豹,可能有些shell不支持此種寫法。不過bash完美支持诺祸。以上寫法注意括號內(nèi)兩邊都有空格携悯。

#!/bin/bash

var1=test

var2=Test

if [[ $test < $test2 ]]

then

echo "test1 < test2"

else

echo "test1 >= test2"

fi

這下終于不用轉(zhuǎn)義了。

文件比較

對于文件的比較序臂,其實跟上面差不多蚌卤,都是用test命令。由于篇幅有限奥秆,我這兒就不多寫了。通過man test命令可以看到具體的用法咸灿。

case語句

在使用if-then-else語句中构订,如果碰到條件很多的情況,如下:

#!/bin/bash

num=3

if (( $num == 1 ))

then

echo "num=1"

elif (( $num == 2 ))

then

echo "num=2"

elif (( $num == 3 ))

then

echo "num=3"

elif (( $num == 4 ))

then

echo "num=4"

fi

如果再多點條件避矢,看起來是不是很多悼瘾?

此時,其實還有一種替代方案审胸,那就是使用case.

case variable in

pattern1 | pattern2) commands1;; pattern3) commands2;;

*) default commands;;

esac

將以上代碼替換為case:

#!/bin/bash

case $num in

1)

echo "num=1";;

2)

echo "num=2";;

3)

echo "num=3";;

4)

echo "num=4";;

*)

echo "defaul";;

esac

小結(jié)

本篇主要講了條件語句亥宿。shell中的條件語句與其他編程語言相比有不小的區(qū)別,最大的區(qū)別就在于條件語句后接的是命令砂沛,而不是布爾值烫扼, 是根據(jù)命令執(zhí)行退出的狀態(tài)碼來決定是否進(jìn)入then語句的。這點需要牢記碍庵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末映企,一起剝皮案震驚了整個濱河市悟狱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堰氓,老刑警劉巖挤渐,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異双絮,居然都是意外死亡浴麻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門囤攀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白胀,“玉大人,你說我怎么就攤上這事抚岗』蚋埽” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵宣蔚,是天一觀的道長向抢。 經(jīng)常有香客問我,道長胚委,這世上最難降的妖魔是什么挟鸠? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮亩冬,結(jié)果婚禮上艘希,老公的妹妹穿的比我還像新娘。我一直安慰自己硅急,他們只是感情好覆享,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著营袜,像睡著了一般撒顿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荚板,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天凤壁,我揣著相機(jī)與錄音,去河邊找鬼跪另。 笑死拧抖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的免绿。 我是一名探鬼主播唧席,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了袱吆?” 一聲冷哼從身側(cè)響起厌衙,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绞绒,沒想到半個月后婶希,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蓬衡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年喻杈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狰晚。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡筒饰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壁晒,到底是詐尸還是另有隱情瓷们,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布秒咐,位于F島的核電站谬晕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏携取。R本人自食惡果不足惜攒钳,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雷滋。 院中可真熱鬧不撑,春花似錦、人聲如沸晤斩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尸昧。三九已至揩页,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烹俗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工萍程, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留幢妄,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓茫负,卻偏偏與公主長得像蕉鸳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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

  • 中級篇 一榕吼、結(jié)構(gòu)化命令 在基礎(chǔ)篇的示例中,Shell 大多數(shù)情況下都以順序的方式依次執(zhí)行腳本中的每一條指令勉失。但是在...
    rollingstarky閱讀 458評論 0 0
  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,323評論 0 2
  • 個人學(xué)習(xí)批處理的初衷來源于實際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求顽素,從而在測試過程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,685評論 0 11
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,720評論 0 10
  • 第 2 章 SHELL 基礎(chǔ)知識2.1 shell腳本我們在上面簡單介紹了一下什么是shell腳本胁出,現(xiàn)在我們來進(jìn)一...
    LiWei_9e4b閱讀 1,553評論 0 0