免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
shell十三問(wèn),為linux學(xué)習(xí)打基礎(chǔ)(三)



本文整理并轉(zhuǎn)自CU上的帖子[學(xué)習(xí)共享] shell 十三問(wèn)?,此貼是2003年發(fā)表的,但卻是相當(dāng)不錯(cuò)的linux基礎(chǔ)知識(shí)匯集貼,原帖主使用的臺(tái)灣風(fēng)格,本文加以簡(jiǎn)體化和整理。

第11問(wèn):> 與 < 差在哪?

11.1

談到I/O redirection,不妨先讓我們認(rèn)識(shí)一下File Descriptor(FD)。程序的運(yùn)算,在大部份情況下都是進(jìn)行數(shù)據(jù)(data)的處理,這些數(shù)據(jù)從哪讀進(jìn)?又,送出到哪里呢?這就是File descriptor(FD)的功用了。

在shell程序中,最常使用的FD大概有三個(gè),分別為:

  • 0: Standard Input(STDIN)
  • 1: Standard Output(STDOUT)
  • 2: Standard Error Output(STDERR)

在標(biāo)準(zhǔn)情況下,這些FD分別跟如下設(shè)備(device)關(guān)聯(lián):

  • stdin(0):keyboard
  • stdout(1):monitor
  • stderr(2):monitor

我們可以用如下下命令測(cè)試一下:

$ mail -s test rootthis is a test mail.please skip.^d(同時(shí)按crtl跟d鍵)

很明顯,mail程序所讀進(jìn)的數(shù)據(jù),就是從stdin也就是keyboard讀進(jìn)的。不過(guò),不見得每個(gè)程序的stdin都跟mail一樣從keyboard讀進(jìn),因?yàn)槌绦蜃髡呖梢詮臋n案參數(shù)讀進(jìn)stdin,如:

$ cat /etc/passwd

但,要是cat之后沒有檔案參數(shù)則又如何呢?哦,請(qǐng)您自己玩玩看啰….^_^

$ cat

(請(qǐng)留意數(shù)據(jù)輸出到哪里去了,最后別忘了按^d離開…)至于stdout與stderr,嗯…等我有空再續(xù)吧…^_^ 還是,有哪位前輩要來(lái)玩接龍呢?

11.2

沿文再續(xù),書接上一回…^_^ 相信,經(jīng)過(guò)上一個(gè)練習(xí)后,你對(duì)stdin與stdout應(yīng)該不難理解吧?然后,讓我們繼續(xù)看stderr好了。

事實(shí)上,stderr沒甚么難理解的:說(shuō)穿了就是“錯(cuò)誤信息”要往哪邊送而已…比方說(shuō),若讀進(jìn)的檔案參數(shù)是不存在的,那我們?cè)趍onitor上就看到了:

$ ls no.such.filels: no.such.file: No such file or directory

若,一個(gè)命令同時(shí)產(chǎn)生stdout與stderr呢?那還不簡(jiǎn)單,都送到monitor來(lái)就好了:

$ touch my.file$ ls my.file no.such.filels: no.such.file: No such file or directorymy.file

okay,至此,關(guān)于FD及其名稱、還有相關(guān)聯(lián)的設(shè)備,相信你已經(jīng)沒問(wèn)題了吧?那好,接下來(lái)讓我們看看如何改變這些FD的預(yù)設(shè)數(shù)據(jù)信道,我們可用<來(lái)改變讀進(jìn)的數(shù)據(jù)信道(stdin),使之從指定的檔案讀進(jìn)。我們可用>來(lái)改變送出的數(shù)據(jù)信道(stdout,stderr),使之輸出到指定的檔案。比方說(shuō):

$ cat < my.file

就是從my.file讀進(jìn)數(shù)據(jù)

$ mail -s test root < /etc/passwd

則是從/etc/passwd讀進(jìn)…

這樣一來(lái),stdin將不再是從keyboard讀進(jìn),而是從檔案讀進(jìn)了…嚴(yán)格來(lái)說(shuō),<符號(hào)之前需要指定一個(gè)FD的(之間不能有空白),但因?yàn)?code style="margin: 0px 0.15em; padding: 0px 0.3em; border-radius: 3px; border: 1px solid rgb(234, 234, 234); border-image: none; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 0.85em; display: inline; white-space: pre-wrap; background-color: rgb(248, 248, 248);">0是<的預(yù)設(shè)值,因此<0<是一樣的!okay,這個(gè)好理解吧?

那,要是用兩個(gè)<<又是啥呢?這是所謂的HERE Document,它可以讓我們輸入一段文本,直到讀到<<后指定的字串。比方說(shuō):

$ cat <<FINISHfirst line heresecond line therethird line nowhereFINISH

這樣的話,cat會(huì)讀進(jìn)3行句子,而無(wú)需從keyboard讀進(jìn)數(shù)據(jù)且要等^d結(jié)束輸入。至>又如何呢?且聽下回分解…

11.3

okay,又到講古時(shí)間~~~當(dāng)你搞懂了0<原來(lái)就是改變stdin的數(shù)據(jù)輸入信道之后,相信要理解如下兩個(gè)redirection就不難了:1> 2> 。前者是改變stdout的數(shù)據(jù)輸出信道,后者是改變stderr的數(shù)據(jù)輸出信道。兩者都是將原本要送出到monitor的數(shù)據(jù)轉(zhuǎn)向輸出到指定檔案去。

由于1>的預(yù)設(shè)值,因此,1>>是相同的,都是改變stdout。用上次的ls例子來(lái)說(shuō)明一下好了:

$ ls my.file no.such.file 1>file.outls: no.such.file: No such file or directory

這樣monitor就只剩下stderr而已。因?yàn)閟tdout給寫進(jìn)file.out去了。

$ ls my.file no.such.file 2>file.errmy.file

這樣monitor就只剩下stdout,因?yàn)閟tderr寫進(jìn)了file.err。

$ ls my.file no.such.file 1>file.out 2>file.err

這樣monitor就啥也沒有,因?yàn)閟tdout與stderr都給轉(zhuǎn)到檔案去了…

呵~~~看來(lái)要理解>一點(diǎn)也不難啦﹗是不?沒騙你吧?^_^ 不過(guò),有些地方還是要注意一下的。
首先,是同時(shí)寫入的問(wèn)題。比方如下這個(gè)例子:

$ ls my.file no.such.file 1>file.both 2>file.both

假如stdout(1)與stderr(2)都同時(shí)在寫入file.both的話,則是采取“覆蓋”方式:后來(lái)寫入的覆蓋前面的。讓我們假設(shè)一個(gè)stdout與stderr同時(shí)寫入file.out的情形好了:

  • 首先stdout寫入10個(gè)字元
  • 然后stderr寫入6個(gè)字元

那么,這時(shí)候原本stdout輸出的10個(gè)字元就被stderr覆蓋掉了。那,如何解決呢?所謂山不轉(zhuǎn)路轉(zhuǎn)、路不轉(zhuǎn)人轉(zhuǎn)嘛,我們可以換一個(gè)思維:將stderr導(dǎo)進(jìn)stdout或?qū)tdout導(dǎo)進(jìn)sterr,而不是大家在搶同一份檔案,不就行了﹗bingo﹗就是這樣啦:

  • 2>&1就是將stderr并進(jìn)stdout作輸出
  • 1>&2>&2就是將stdout并進(jìn)stderr作輸出

于是,前面的錯(cuò)誤操作可以改為:

$ ls my.file no.such.file 1>file.both 2>&1或$ ls my.file no.such.file 2>file.both >&2

這樣,不就皆大歡喜了嗎?呵~~~ ^_^ 不過(guò),光解決了同時(shí)寫入的問(wèn)題還不夠,我們還有其他技巧需要了解的。故事還沒結(jié)束,別走開﹗廣告后,我們?cè)倩貋?lái)…﹗

11.4

okay,這次不講I/O Redirction,講佛吧…(有沒搞錯(cuò)?﹗網(wǎng)中人是否頭殼燒壞了?…)嘻~~~ ^_^

學(xué)佛的最高境界,就是“四大皆空”。至于是空哪四大塊?我也不知,因?yàn)槲疫€沒到那境界…但這個(gè)“空”字,卻非常值得我們返復(fù)把玩的:—-色即是空、空即是色﹗好了,施主要是能夠領(lǐng)會(huì)“空”的禪意,那離修成正果不遠(yuǎn)矣~~~

在Linux檔案系統(tǒng)里,有個(gè)設(shè)備檔位于/dev/null。許多人都問(wèn)過(guò)我那是甚么玩意兒?我跟你說(shuō)好了:那就是“空”啦﹗沒錯(cuò)﹗空空如也的空就是null了….請(qǐng)問(wèn)施主是否忽然有所頓誤了呢?然則恭喜了~~~ ^_^ 這個(gè)null在I/O Redirection中可有用得很呢:

  • 若將FD1FD2轉(zhuǎn)到/dev/null去,就可將stdout與stderr弄不見掉。
  • 若將FD0接到/dev/null來(lái),那就是讀進(jìn)nothing。

比方說(shuō),當(dāng)我們?cè)趫?zhí)行一個(gè)程序時(shí),畫面會(huì)同時(shí)送出stdout跟stderr,
假如你不想看到stderr(也不想存到檔案去),那可以:

$ ls my.file no.such.file 2>/dev/nullmy.file

若要相反:只想看到stderr呢?還不簡(jiǎn)單﹗將stdout弄到null就行:

$ ls my.file no.such.file >/dev/nullls: no.such.file: No such file or directory

那接下來(lái),假如單純只跑程序,不想看到任何輸出結(jié)果呢?哦,這里留了一手上次節(jié)目沒講的法子,專門贈(zèng)予有緣人﹗…^_^ 除了用>/dev/null 2>&1之外,你還可以如此:

$ ls my.file no.such.file &>/dev/null

(提示:將&>換成>&也行啦~~?。?/p>

okay?講完佛,接下來(lái),再讓我們看看如下情況:

$ echo "1" > file.out$ cat file.out1$ echo "2" > file.out$ cat file.out2

看來(lái),我們?cè)谥貙?dǎo)stdout或stderr進(jìn)一份檔案時(shí),似乎永遠(yuǎn)只獲得最后一次導(dǎo)入的結(jié)果。那,之前的內(nèi)容呢?呵~~~要解決這個(gè)問(wèn)提很簡(jiǎn)單啦,將>換成>>就好:

$ echo "3" >> file.out$ cat file.out23

如此一來(lái),被重導(dǎo)的目標(biāo)檔案之內(nèi)容并不會(huì)失去,而新的內(nèi)容則一直增加在最后面去。easy?呵…^_^

但,只要你再一次用回單一的>來(lái)重導(dǎo)的話,那么,舊的內(nèi)容還是會(huì)被“洗”掉的﹗這時(shí),你要如何避免呢?——備份﹗yes,我聽到了﹗不過(guò)….還有更好的嗎?既然與施主這么有緣份,老納就送你一個(gè)錦囊妙法吧:

$ set -o noclobber$ echo "4" > file.out-bash: file: cannot overwrite existing file

那,要如何取消這個(gè)“限制”呢?哦,將set -o換成set +o就行:

$ set +o noclobber$ echo "5" > file.out$ cat file.out5

再問(wèn):那…有辦法不取消而又“臨時(shí)”蓋寫目標(biāo)檔案嗎?哦,佛曰:不可告也﹗啊~開玩笑的、開玩笑的啦~ ^_^唉,早就料到人心是不足的了﹗

$ set -o noclobber$ echo "6" >| file.out$ cat file.out6

留意到?jīng)]有:在>后面再加個(gè)“|”就好(注意:>與|之間不能有空白哦)… 呼…(深呼吸吐納一下吧)~~~ ^_^再來(lái)還有一個(gè)難題要你去參透的呢:

$ echo "some text here" > file$ cat < filesome text here$ cat < file > file.bak$ cat < file.baksome text here$ cat < file > file$ cat < file

嗯?!注意到?jīng)]有???!——怎么最后那個(gè)cat命令看到的file竟是空的?﹗why?why?why?同學(xué)們:下節(jié)課不要遲到啰~~~!

11.5

當(dāng)當(dāng)當(dāng)~上課啰~ ^_^
前面提到:$ cat < file > file 之后原本有內(nèi)容的檔案結(jié)果卻被洗掉了﹗要理解這一現(xiàn)像其實(shí)不難,這只是priority的問(wèn)題而已:

在IO Redirection中,stdout與stderr的管道會(huì)先準(zhǔn)備好,才會(huì)從stdin讀進(jìn)數(shù)據(jù)。也就是說(shuō),在上例中,> file會(huì)先將file清空,然后才讀進(jìn)< file,但這時(shí)候檔案已經(jīng)被清空了,因此就變成讀不進(jìn)任何數(shù)據(jù)了…哦~原來(lái)如此~~ ^_^

那…如下兩例又如何呢?

$ cat <> file$ cat < file >> file

嗯…同學(xué)們,這兩個(gè)答案就當(dāng)練習(xí)題啰,下節(jié)課之前請(qǐng)交作業(yè)﹗好了,I/O Redirection也快講完了,sorry,因?yàn)槲乙仓恢肋@么多而已啦~嘻 ^_^ 不過(guò),還有一樣?xùn)|東是一定要講的,各位觀眾(請(qǐng)自行配樂(lè)~!#@!$%):——就是pipe line也!

談到pipe line,我相信不少人都不會(huì)陌生:我們?cè)诤芏郼ommand line上常看到的“|”符號(hào)就是pipe line了。不過(guò),究竟pipe line是甚么東東呢?別急別急…先查一下英漢字典,看看pipe是甚么意思?沒錯(cuò)﹗它就是“水管”的意思…那么,你能想像一下水管是怎么一根接著一根的嗎?又,每根水管之間的input跟output又如何呢?嗯??靈光一閃:原來(lái)pipe line的I/O跟水管的I/O是一模一樣的:上一個(gè)命令的stdout接到下一個(gè)命令的stdin去了!的確如此…不管在command line上你使用了多少個(gè)pipe line,前后兩個(gè)command的I/O都是彼此連接的﹗(恭喜:你終于開竅了﹗^_^)

不過(guò)…然而…但是……stderr呢?好問(wèn)題﹗不過(guò)也容易理解:若水管漏水怎么辦?也就是說(shuō):在pipe line之間,前一個(gè)命令的stderr是不會(huì)接進(jìn)下一命令的stdin的,其輸出,若不用2>導(dǎo)到file去的話,它還是送到攝像頭上面來(lái)﹗這點(diǎn)請(qǐng)你在pipe line運(yùn)用上務(wù)必要注意的。那,或許你又會(huì)問(wèn):有辦法將stderr也喂進(jìn)下一個(gè)命令的stdin去嗎?(貪得無(wú)厭的家伙﹗)方法當(dāng)然是有,而且你早已學(xué)過(guò)了﹗^_^ 我提示一下就好:請(qǐng)問(wèn)你如何將stderr合并進(jìn)stdout一同輸出呢?若你答不出來(lái),下課之后再來(lái)問(wèn)我吧…(如果你臉皮真夠厚的話…)

或許,你仍意尤未盡﹗或許,你曾經(jīng)碰到過(guò)下面的問(wèn)題:

cm1 | cm2 | cm3…這段pipe line中,若要將cm2的結(jié)果存到某一檔案呢?

若你寫成cm1 | cm2 > file | cm3的話,那你肯定會(huì)發(fā)現(xiàn)cm3的stdin是空的﹗(當(dāng)然啦,你都將水管接到別的水池了﹗)聰明的你或許會(huì)如此解決:cm1 | cm2 > file; cm3 < file 是的,你的確可以這樣做,但最大的壞處是:這樣一來(lái),file I/O會(huì)變雙倍﹗在command執(zhí)行的整個(gè)過(guò)程中,file I/O是最常見的最大性能殺手。凡是有經(jīng)驗(yàn)的shell操作者,都會(huì)盡量避免或降低file I/O的頻率。那,上面問(wèn)題還有更好方法嗎?有的,那就是tee命令了。

所謂tee命令是在不影響原本I/O的情況下,將stdout復(fù)制一份到檔案去。因此,上面的命令行可以如此打:

cm1 | cm2 | tee file | cm3

在預(yù)設(shè)上,tee會(huì)改寫目標(biāo)檔案,若你要改為增加內(nèi)容的話,那可用-a參數(shù)達(dá)成。
基本上,pipe line的應(yīng)用在shell操作上是非常廣泛的,尤其是在text filtering方面,
凡舉catmore,headtail,wcexpand,trgrepsed,awk,…等等文字處理工具,搭配起pipe line來(lái)使用,你會(huì)驚覺command line原來(lái)是活得如此精彩的﹗常讓人有“眾里尋他千百度,驀然回首,那人卻在燈火闌珊處﹗”之感…^_^

好了,關(guān)于I/O Redirection的介紹就到此告一段落。若日后有空的話,再為大家介紹其它在shell上好玩的東西﹗bye…^_^

第12問(wèn):你要 if 還是 case 呢?

放了一個(gè)愉快的春節(jié)假期,人也變得懶懶散散的…只是,答應(yīng)了大家的作業(yè),還是要堅(jiān)持完成就是了~~~

還記得我們?cè)诘?0章所介紹的return value嗎?是的,接下來(lái)介紹的內(nèi)容與之有關(guān),若你的記憶也被假期的歡樂(lè)時(shí)光所抵消掉的話,那,建議您還是先回去溫習(xí)溫習(xí)再回來(lái)…

若你記得return value,我想你也應(yīng)該記得了&&||是甚么意思吧?用這兩個(gè)符號(hào)再配搭command group的話,我們可讓shell script變得更加聰明哦。比方說(shuō):

comd1 && {    comd2    comd3    :} || {    comd4    comd5}

意思是說(shuō):假如comd1的return value為true的話,然則執(zhí)行comd2與comd3,否則執(zhí)行comd4與comd5。

事實(shí)上,我們?cè)趯憇hell script的時(shí)候,經(jīng)常需要用到這樣那樣的條件以作出不同的處理動(dòng)作。
&&||的確可以達(dá)成條件執(zhí)行的效果,然而,從“人類語(yǔ)言”上來(lái)理解,卻不是那么直觀。
更多時(shí)候,我們還是喜歡用if….then…else…這樣的keyword來(lái)表達(dá)條件執(zhí)行。在bash shell中,我們可以如此修改上一段代碼:

if comd1then    comd2    comd3else    comd4    comd5fi

這也是我們?cè)趕hell script中最常用到的if判斷式:只要if后面的command line返回true的return value(我們最常用test命令來(lái)送出return value),然則就執(zhí)行then后面的命令,否則執(zhí)行else后的命令;fi則是用來(lái)結(jié)束判斷式的keyword。

在if判斷式中,else部份可以不用,但then是必需的。(若then后不想跑任何command,可用:這個(gè)null command代替)。當(dāng)然,then或else后面,也可以再使用更進(jìn)一層的條件判斷式,這在shell script設(shè)計(jì)上很常見。

若有多項(xiàng)條件需要“依序”進(jìn)行判斷的話,那我們則可使用elif這樣的keyword:

if comd1; then    comd2elif comd3; then    comd4else    comd5fi

意思是說(shuō):若comd1為true,然則執(zhí)行comd2;否則再測(cè)試comd3,然則執(zhí)行comd4;倘若comd1與comd3均不成立,那就執(zhí)行comd5。

if判斷式的例子很常見,你可從很多shell script中看得到,我這里就不再舉例子了…接下來(lái)要為大家介紹的是case判斷式。

雖然if判斷式已可應(yīng)付大部份的條件執(zhí)行了,然而,在某些場(chǎng)合中,卻不夠靈活,尤其是在string式樣的判斷上,比方如下:

QQ() {    echo -n "Do you want to continue?(Yes/No):"    read YN    if [ "$YN" = Y -o "$YN" = y -o "$YN" = "Yes" -o "$YN" = "yes" -o "$YN" = "YES" ]    then        QQ    else        exit 0    fi}QQ

從例中,我們看得出來(lái),最麻煩的部份是在于判斷YN的值可能有好幾種式樣。聰明的你或許會(huì)如此修改:

if echo "$YN" | grep -q '^[Yy]\([Ee][Ss]\)*$'

也就是用Regular Expression來(lái)簡(jiǎn)化代碼。(我們有機(jī)會(huì)再來(lái)介紹RE)只是…是否有其它更方便的方法呢?有的,就是用case判斷式即可:

QQ() {    echo -n "Do you want to continue?(Yes/No):"    read YN    case "$YN" in        [Yy]|[Yy][Ee][Ss])            QQ            ;;        *)            exit 0            ;;    esac}QQ

我們常用case的判斷式來(lái)判斷某一變量在不同的值(通常是string)時(shí)作出不同的處理,比方說(shuō),判斷script參數(shù)以執(zhí)行不同的命令。若你有興趣、且用Linux系統(tǒng)的話,不妨挖一挖/etc/init.d/*里那堆script中的case用法。如下就是一例:

case "$1" in    start)        start        ;;    stop)        stop        ;;    status)        rhstatus        ;;    restart|reload)        restart        ;;    condrestart)        [ -f /var/lock/subsys/syslog ] && restart || :        ;;    *)        echo $"Usage: $0 {start|stop|status|restart|condrestart}"        exit 1    esac

(若你對(duì)positional parameter的印像已經(jīng)模糊了,請(qǐng)重看第9章吧。)okay,十三問(wèn)還剩一問(wèn)而已,過(guò)幾天再來(lái)搞定之….^_^

第13問(wèn):for what?while與until差在哪?

終于,來(lái)到shell十三問(wèn)的最后一問(wèn)了…長(zhǎng)長(zhǎng)吐一口氣~~~~

最后要介紹的是shell script設(shè)計(jì)中常見的“循環(huán)”(loop)。所謂的loop就是script中的一段在一定條件下反復(fù)執(zhí)行的代碼。bash shell中常用的loop有如下三種:for  while  until

for loop是從一個(gè)清單列表中讀進(jìn)變量值,并“依次”的循環(huán)執(zhí)行do到done之間的命令行。例:

for var in one two three four fivedo    echo -----------    echo '$var is '$var    echodone

上例的執(zhí)行結(jié)果將會(huì)是:

  • 1.for會(huì)定義一個(gè)叫var的變量,其值依次是one two three four five。
  • 2.因?yàn)橛?個(gè)變量值,因此do與done之間的命令行會(huì)被循環(huán)執(zhí)行5次。
  • 3.每次循環(huán)均用echo產(chǎn)生三行句子。而第二行中不在hard quote之內(nèi)的$var會(huì)依次被替換為one two three four five。
  • 4.當(dāng)最后一個(gè)變量值處理完畢,循環(huán)結(jié)束。

我們不難看出,在for loop中,變量值的多寡,決定循環(huán)的次數(shù)。然而,變量在循環(huán)中是否使用則不一定,得視設(shè)計(jì)需求而定。倘若for loop沒有使用in這個(gè)keyword來(lái)指定變量值清單的話,其值將從$@或$*)中繼承:

for var; do…done

(若你忘記了positional parameter,請(qǐng)溫習(xí)第9章…)

for loop用于處理“清單”(list)項(xiàng)目非常方便,其清單除了可明確指定或從positional parameter取得之外,也可從變量替換或命令替換取得…(再一次提醒:別忘了命令行的“重組”特性?。?/p>

然而,對(duì)于一些“累計(jì)變化”的項(xiàng)目(如整數(shù)加減),for亦能處理:

for ((i=1;i<=10;i++))do    echo "num is $i"done

除了for loop,上面的例子我們也可改用while loop來(lái)做到:

num=1while [ "$num" -le 10 ]; do    echo "num is $num"    num=$(($num + 1))done

while loop的原理與for loop稍有不同:它不是逐次處理清單中的變量值,而是取決于while后面的命令行之return value:

  • 若為ture,則執(zhí)行dodone之間的命令,然后重新判斷while后的return value。
  • 若為false,則不再執(zhí)行do與done之間的命令而結(jié)束循環(huán)。

分析上例:

  • 1.在while之前,定義變量num=1。
  • 2.然后測(cè)試(test)$num是否小于或等于10。
  • 3.結(jié)果為true,于是執(zhí)行echo并將num的值加一。
  • 4.再作第二輪測(cè)試,此時(shí)num的值為1+1=2,依然小于或等于10,因此為true,繼續(xù)循環(huán)。
  • 5.直到num為10+1=11時(shí),測(cè)試才會(huì)失敗…于是結(jié)束循環(huán)。

我們不難發(fā)現(xiàn):若while的測(cè)試結(jié)果永遠(yuǎn)為true的話,那循環(huán)將一直永久執(zhí)行下去:

while : ;do    echo looping…done

上例的:是bash的null command,不做任何動(dòng)作,除了送回true的return value。因此這個(gè)循環(huán)不會(huì)結(jié)束,稱作死循環(huán)。死循環(huán)的產(chǎn)生有可能是故意設(shè)計(jì)的(如跑daemon),也可能是設(shè)計(jì)錯(cuò)誤。若要結(jié)束死循環(huán),可透過(guò)signal來(lái)終止(如按下ctrl-c)。(關(guān)于process與signal,等日后有機(jī)會(huì)再補(bǔ)充,十三問(wèn)暫時(shí)略過(guò)。)

一旦你能夠理解while loop的話,那,就能理解until loop:

與while相反,until是在return value為false時(shí)進(jìn)入循環(huán),否則結(jié)束。

因此,前面的例子我們也可以輕松的用until來(lái)寫:

num=1until [ ! "$num" -le 10 ]; do    echo "num is $num"    num=$(($num + 1))done

或是:

num=1until [ "$num" -gt 10 ]; do    echo "num is $num"    num=$(($num + 1))done

okay,關(guān)于bash的三個(gè)常用的loop暫時(shí)介紹到這里。在結(jié)束本章之前,再跟大家補(bǔ)充兩個(gè)與loop有關(guān)的命令:break  continue

這兩個(gè)命令常用在復(fù)合式循環(huán)里,也就是在do…done之間又有更進(jìn)一層的loop,當(dāng)然,用在單一循環(huán)中也未嘗不可啦…^_^

break是用來(lái)打斷循環(huán),也就是“強(qiáng)迫結(jié)束”循環(huán)。若break后面指定一個(gè)數(shù)值n的話,則“從里向外”打斷第n個(gè)循環(huán),預(yù)設(shè)值為break 1,也就是打斷當(dāng)前的循環(huán)。
在使用break時(shí)需要注意的是,它與return及exit是不同的:

  • break是結(jié)束loop
  • return是結(jié)束function
  • exit是結(jié)束script/shell

continue則與break相反:強(qiáng)迫進(jìn)入下一次循環(huán)動(dòng)作。若你理解不來(lái)的話,那你可簡(jiǎn)單的看成:在continuedone之間的句子略過(guò)而返回循環(huán)頂端…與break相同的是:continue后面也可指定一個(gè)數(shù)值n,以決定繼續(xù)哪一層(從里向外計(jì)算)的循環(huán),預(yù)設(shè)值為continue 1,也就是繼續(xù)當(dāng)前的循環(huán)。
在shell script設(shè)計(jì)中,若能善用loop,將能大幅度提高script在復(fù)雜條件下的處理能力。請(qǐng)多加練習(xí)吧….

好了,該是到了結(jié)束的時(shí)候了。

婆婆媽媽的跟大家羅唆了一堆關(guān)于shell的基礎(chǔ)概念,目的不是要告訴大家“答案”,而是要帶給大家“啟發(fā)”…在日后關(guān)于shell的討論中,我或許會(huì)經(jīng)常用“連接”方式指引回來(lái)十三問(wèn)中的內(nèi)容,以便我們?cè)谶M(jìn)行技術(shù)探討時(shí)彼此能有一些討論基礎(chǔ),而不至于各說(shuō)各話、徒費(fèi)時(shí)力。但,更希望十三問(wèn)能帶給你更多的思考與樂(lè)趣,至為重要的是透過(guò)實(shí)作來(lái)加深理解。

是的,我很重視“實(shí)作”與“獨(dú)立思考”這兩項(xiàng)學(xué)習(xí)要素,若你能夠掌握其中真義,那請(qǐng)容我說(shuō)聲:
—-恭喜﹗十三問(wèn)你沒白看了﹗^_^

p.s.

至于補(bǔ)充問(wèn)題部份,我暫時(shí)不寫了。而是希望:

  • 1.大家擴(kuò)充題目。
  • 2.一起來(lái)寫心得。

Good luck and happy studying!


原文鏈接:https://segmentfault.com/a/1190000004325734
原文鏈接:http://bbs.chinaunix.net/thread-218853-1-1.html


注:由于微信文章字?jǐn)?shù)限制,本文章設(shè)置為連載系列, 本篇是連載的最后一篇,感謝關(guān)注~

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
經(jīng)典的 Shell 十三問(wèn)
I/O重定向 詳解及例子
stdin, stdout, stderr以及重定向
【Linux 筆記】Linux 基本操作 - 02. shell編程基礎(chǔ)
Shell(二):變量、數(shù)據(jù)重定向和管道
FILE *stdout 和 STDOUT
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服