shell for循環(huán)總結(jié)

1 shell for循環(huán)語法

for 變量 in 列表

do

? ? command1

? ? command2

? ? ...

? ? commandN

done

1.1 讀取列表中的值

#!/bin/bash

for test in apple boy cat dog

do

? echo The next state is $test

done

結(jié)果:

The next state is apple

The next state is boy

The next state is cat

The next state is dog

1.2 讀取列表中的復(fù)雜值

有兩種解決辦法:

#使用轉(zhuǎn)義字符(反斜線)來將單引號轉(zhuǎn)移嘴办;

#使用雙引號來定義用到單引號的值买鸽。

#!/bin/bash

for test in I don\'t think if "this'll" work

do

? echo The next state is $test

done

結(jié)果是:

The next state is I

The next state is don't

The next state is think

The next state is if

The next state is this'll

The next state is work

*記住,for命令用空格來劃分列表中的每個(gè)值眼五。如果在單獨(dú)的數(shù)據(jù)值中有空格,就必須用雙引號將這些值圈起來看幼。

1.3 從變量讀取列表

將一系列的值都集中存儲在一個(gè)變量中,然后需要遍歷變量中的整個(gè)列表桌吃。

#!/bin/bash

list="helllo world"

#向已有列表中添加或拼接一個(gè)值

list=$list" ok"

for state in $list

do

? echo "this word? is $state"

done

結(jié)果是:

this word is helllo

this word? is world

this word? is ok

1.4 從命令讀取值

有兩種方式可以將命令輸出賦值給變量:?

(1)反引號字符(``)?

(2)$()格式

如:

for i in $(who)

do

? echo "visit beautiful $i"

done

輸出結(jié)果:

visit beautiful etldev

visit beautiful pts/0

visit beautiful 2019-05-15

visit beautiful 09:31

visit beautiful (112.64.161.227)

visit beautiful root

visit beautiful pts/1

visit beautiful 2019-05-09

visit beautiful 07:41

visit beautiful (10.1.1.62)

visit beautiful etldev

visit beautiful pts/3

visit beautiful 2019-05-15

visit beautiful 09:34

visit beautiful (112.64.161.227)

visit beautiful etldev

visit beautiful pts/4

visit beautiful 2019-05-15

visit beautiful 10:49

visit beautiful (112.64.161.227)

*who默認(rèn)輸出當(dāng)前登錄的所有用戶的信息如下所示

etldev pts/0? ? ? ? 2019-05-15 09:31 (112.64.161.227)

root? ? pts/1? ? ? ? 2019-05-09 07:41 (10.1.1.62)

etldev? pts/3? ? ? ? 2019-05-15 09:34 (112.64.161.227)

etldev? pts/4? ? ? ? 2019-05-15 10:49 (112.64.161.227)

1.5?更改字段分隔符

造成這個(gè)問題的原因是特殊的環(huán)境變量IFS,叫作內(nèi)部字段分隔符。默認(rèn)情況下搬卒,bash shell會將下列字符當(dāng)作字段分隔符:

*空格

*制表符

*換行符

如果bash shell在數(shù)據(jù)中看到這些字符中的任意一個(gè),它就會假定這表明了列表中一個(gè)新數(shù)據(jù)字段的開始契邀。

想修改IFS的值,使其只能識別換行符,那就必須:

IFS=$'\n'

將這個(gè)語句加入到腳本中微饥,告訴bash shell在數(shù)據(jù)值中忽略空格和制表符。

一個(gè)可參考的安全實(shí)踐是在改變IFS之前保存原來的IFS值欠橘,之后再恢復(fù)它。

實(shí)現(xiàn):

IFS.OLD=$IFS

IFS=$'\n'

<在代碼中使用新的IFS值>

IFS=$IFS.OLD

這就保證了在腳本的后續(xù)操作中使用的是IFS的默認(rèn)值肃续。

遍歷一個(gè)文件中用冒號分隔的值:

IFS=:

如果要指定多個(gè)IFS字符,只要將它們在賦值行串起來就行始锚。

IFS=$'\n':;"

這個(gè)賦值會將換行符刽酱、冒號、分號和雙引號作為字段分隔符棵里。如何使用IFS字符解析數(shù)據(jù)沒有任何限制。

1.6?用通配符讀取目錄

for file in /proc/*;?

do?

echo $file is file path \! ;?

done

2?類C風(fēng)格for循環(huán)的語法格式

for((expr1; expr2; expr3))

do?

? ? command?

? ? command?

? ? ...?

done

有些部分并沒有遵循bash shell標(biāo)準(zhǔn)的for命令:?

*變量賦值可以有空格?

*條件中的變量不以美元符開頭?

*迭代過程的算式為用expr命令格式

#!/bin/bash

#使用類C風(fēng)格for循環(huán)輸出1~5

?for ((integer = 1; integer <= 5; integer++))

?do

? ?echo "$integer"??

done?

結(jié)果:

1

2

3

4

5

使用類C風(fēng)格for循環(huán)要注意以下事項(xiàng):

a.如果循環(huán)條件最初的退出狀態(tài)為非0衍慎,則不會執(zhí)行循環(huán)體

b.當(dāng)執(zhí)行更新語句時(shí),如果循環(huán)條件的退出狀態(tài)永遠(yuǎn)為0皮钠,則for循環(huán)將永遠(yuǎn)執(zhí)行下去稳捆,從而產(chǎn)生死循環(huán)

c.Linux shell中不運(yùn)行使用非整數(shù)類型的數(shù)作為循環(huán)變量

d.如果循環(huán)體中的循環(huán)條件被忽略,則默認(rèn)的退出狀態(tài)為0

e.在類C風(fēng)格的for循環(huán)中麦轰,可以將三個(gè)語句全部忽略掉乔夯,下面是合法的for循環(huán)

for((; ; ))?

do?

? ? echo "hello world"?

done

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市末荐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甲脏,老刑警劉巖妹笆,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拳缠,居然都是意外死亡墩新,警方通過查閱死者的電腦和手機(jī)窟坐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門海渊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绵疲,“玉大人,你說我怎么就攤上這事盔憨⊙渡颍” “怎么了郁岩?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵芙盘,是天一觀的道長。 經(jīng)常有香客問我儒老,道長,這世上最難降的妖魔是什么驮樊? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮囚衔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘练湿。我一直安慰自己,他們只是感情好肥哎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著篡诽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朱浴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天翰蠢,我揣著相機(jī)與錄音砰碴,去河邊找鬼躏筏。 笑死呈枉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猖辫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼啃憎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辛萍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤悯许,失蹤者是張志新(化名)和其女友劉穎辉阶,沒想到半個(gè)月后先壕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谆甜,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年规辱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片改淑。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炫贤,死狀恐怖溅固,靈堂內(nèi)的尸體忽然破棺而出兰珍,到底是詐尸還是另有隱情侍郭,我是刑警寧澤掠河,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站唠摹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏勾拉。R本人自食惡果不足惜盗温,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一成肘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧双霍,春花似錦、人聲如沸洒闸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸣个,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間囤萤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工涛舍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人富雅。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像毕贼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子鬼癣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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