Shell編程-10-Shell中的循環(huán)語(yǔ)句

? ? 循環(huán)語(yǔ)句常用于重復(fù)執(zhí)行一條命令或一組命令等扇丛,直到達(dá)到結(jié)束條件后筒严,則終止執(zhí)行丹泉。在Shell中常見(jiàn)的循環(huán)命令有whileuntil萝风、forselect等嘀掸。

while語(yǔ)句

基礎(chǔ)語(yǔ)法

while <條件表達(dá)式>
do
  語(yǔ)句
done

while循環(huán)讀取文件

  • 1紫岩、使用exec
exec < FILE
while read line
do
  command
done
  • 2规惰、使用cat和管道
cat FILEPATH/FILE | while read line
do
  command
done
  • 3、在done后使用重定向
while read line
do
  command
done < FILE

while示例

1泉蝌、打印數(shù)字

[root@localhost Test]# cat while.sh
#!/bin/bash
a=$1
while [ ${a} -ge 0 ]
do
  echo "Current number is:" ${a}
  a=$((a-1))
done

[root@localhost Test]# bash while.sh 5
Current number is: 5
Current number is: 4
Current number is: 3
Current number is: 2
Current number is: 1
Current number is: 0

2歇万、讀取文件

# 讀取網(wǎng)卡配置文件
[root@localhost Test]# cat readnet.sh
#!/bin/bash
while read line
 do
  echo ${line}
 done < /etc/sysconfig/network-scripts/ifcfg-ens5f1

[root@localhost Test]# bash readnet.sh
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens5f1
UUID=dbab37df-749f-4cf5-b0a9-c9d7e6632f44
DEVICE=ens5f1
ONBOOT=yes
IPADDR=192.168.8.8
NETMASK=255.255.255.0
GATEWAY=192.168.8.1

until語(yǔ)句

基礎(chǔ)語(yǔ)法

until  <條件表達(dá)式>
do
  語(yǔ)句
done

until語(yǔ)句的語(yǔ)法與while相似,區(qū)別在until會(huì)在條件表達(dá)式不成立時(shí)勋陪,進(jìn)入循環(huán)執(zhí)行命令贪磺,條件表達(dá)式成立時(shí),終止循環(huán)诅愚。until的應(yīng)用場(chǎng)景比較省寒锚,了解即可。

until示例

[root@localhost Test]# cat until.sh
#!/bin/bash
a=$1
until [ ${a} -ge 10 ]
do
  echo "Current number is:" ${a}
  a=$((a-1))
  if [ $a -lt 0 ]
   then
    break
  fi
done
[root@localhost Test]# bash until.sh 5 # 不滿足條件時(shí),進(jìn)入循環(huán)體
Current number is: 5
Current number is: 4
Current number is: 3
Current number is: 2
Current number is: 1
Current number is: 0
[root@localhost Test]# bash until.sh 50 # 滿足條件時(shí)刹前,則不進(jìn)入循環(huán)體
[root@localhost Test]#

for語(yǔ)句

? ? for循環(huán)語(yǔ)句與while循環(huán)詩(shī)句類似泳赋,但for循環(huán)語(yǔ)句主要用于有限次的循環(huán)場(chǎng)景,while主要無(wú)限次循環(huán)的場(chǎng)景喇喉,如守護(hù)進(jìn)程

基礎(chǔ)語(yǔ)法

1祖今、第一種格式

for var in list
do
  語(yǔ)句
done

在該結(jié)構(gòu)中in list可以省略。在省略時(shí)拣技,相當(dāng)于in "$@" 即等價(jià)于for var in "$@"

2千诬、第二種格式

for((ex1;exp2;exp3))
do
  語(yǔ)句
done

這種格式是類C的風(fēng)格,大家也見(jiàn)得較多

for示例

1膏斤、打印數(shù)據(jù)

[root@localhost Test]# cat for.sh
#!/bin/bash
echo "first format for sentense "
for i in {1..5}
do
  echo ${i}
done

echo "second format for sentense"
for((j=1;j<=5;j++))
do
 echo ${j}
done
[root@localhost Test]# bash for.sh
first format for sentense
1
2
3
4
5
second format for sentense
1
2
3
4
5

2徐绑、打印文件名

[root@localhost Test]# cat printfilename.sh 
#!/bin/bash
path=$1
for filename in $(ls $1)
do
 echo ${filename}
done
[root@localhost Test]# bash printfilename.sh "/root/Test/"
caseif.sh
case.sh
compareNum.sh
eval.sh
exec.sh
for.sh
if.sh
para.sh
ping.sh
printfilename.sh
readnet.sh
shift.sh
testPID.sh
testposition.sh
until.sh
while.sh

select語(yǔ)句

? ? select 語(yǔ)句常用于創(chuàng)建選擇性菜單。在執(zhí)行帶有select循環(huán)語(yǔ)句的腳本時(shí)莫辨,輸出會(huì)按照數(shù)字順序列表顯示列表選項(xiàng)泵三,并顯示提示符(默認(rèn)為#?),等待用戶做出選擇衔掸。

基礎(chǔ)語(yǔ)法

select var in list
do
  語(yǔ)句
done

1烫幕、在該結(jié)構(gòu)中in list可以省略,省略相當(dāng)于in "$@"即等價(jià)于select var in "$@"
2敞映、select與for循環(huán)不同的是:select循環(huán)執(zhí)行后會(huì)出現(xiàn)菜單選項(xiàng)等待用戶選擇较曼,不會(huì)自動(dòng)循環(huán)所有變量列表,而用戶輸入的只能是菜單項(xiàng)前面的數(shù)字序號(hào)振愿,每輸入一次對(duì)應(yīng)的序號(hào)則會(huì)執(zhí)行循環(huán)一次捷犹,直至變量后面對(duì)應(yīng)的列表選取完畢

select示例

1、選擇目錄文件

[root@localhost Test]# cat select.sh 
#!/bin/bash
select file in $(ls $1)
do
 echo "Current file is:"${file}
done

[root@localhost Test]# bash select.sh /root/Test
1) caseif.sh           7) if.sh         13) shift.sh
2) case.sh         8) para.sh       14) testPID.sh
3) compareNum.sh       9) ping.sh       15) testposition.sh
4) eval.sh        10) printfilename.sh  16) until.sh
5) exec.sh        11) readnet.sh        17) while.sh
6) for.sh         12) select.sh
#? 2
Current file is:case.sh
#? 3
Current file is:compareNum.sh
#? 19
Current file is:
#?

循環(huán)中斷控制

? ? 大家有過(guò)編程基礎(chǔ)的童鞋都知道冕末,在循環(huán)體出現(xiàn)某一種萍歉,我們可以提前中斷循環(huán)體。在Shell中常用的循環(huán)中斷控制有break档桃、continue枪孩、exitreturn藻肄。

break/continue:常用于if蔑舞、for、while等條件和循環(huán)語(yǔ)句中嘹屯,從而控制流程的走向
exit:常用于終止所有語(yǔ)句并退出當(dāng)前腳本攻询,也可以用于返回前一次程序或命令的執(zhí)行狀態(tài)
return:類似于exit,但return僅適用于函數(shù)內(nèi)部返回函數(shù)的執(zhí)行狀態(tài)值

以上詳細(xì)解釋如下所示:

命令 解釋
break n n:跳出循環(huán)的層數(shù);如省略n,則跳出整個(gè)循環(huán)
continu n n: 退到第n層繼續(xù)循環(huán);如省略n,則跳過(guò)本次循環(huán)州弟,繼續(xù)下一次循環(huán)
exit n 退出當(dāng)前Shell進(jìn)程;n:上一次程序執(zhí)行的狀態(tài)返回值钧栖, 如省略n低零,可使用$?獲取執(zhí)行狀態(tài)值
return n 用于函數(shù)的返回值,可以用來(lái)判斷函數(shù)執(zhí)行是否正確

循環(huán)中斷控制示例

1拯杠、break示例

[root@localhost Test]# cat break.sh
#!/bin/bash

for(( i=1;i<$1;i++ ))
do
  if [ ${i} -eq 3 ]
    then
     echo "break test"
     break
  fi
 echo ${i}
done
[root@localhost Test]# bash break.sh 5
1
2
break test

2毁兆、continue示例

[root@localhost Test]# cat continue.sh
#!/bin/bash

for(( i=1;i<$1;i++ ))
do
  if [ ${i} -eq 3 ]
    then
     echo "contiunue test"
     continue
  fi
 echo ${i}
done
[root@localhost Test]# bash continue.sh 5
1
2
contiunue test
4

3、exit示例

[root@localhost Test]# cat exit.sh

#!/bin/bash
for(( i=1;i<$1;i++ ))
do
  if [ ${i} -eq 3 ]
    then
     echo "exit test"
     exit 88
  fi
 echo ${i}
done
[root@localhost Test]# bash exit.sh 5
1
2
exit test
[root@localhost Test]# echo $?
88

循環(huán)語(yǔ)句總結(jié)

  • 1阴挣、while循環(huán)語(yǔ)句常用于執(zhí)行守護(hù)進(jìn)程以及實(shí)現(xiàn)我們希望循環(huán)持續(xù)執(zhí)行不退出的應(yīng)用气堕,其他的循環(huán)則可以使用for和定時(shí)任務(wù)crond代替
  • 2、根據(jù)使用頻次畔咧,if和for使用最高茎芭,其次是while
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市誓沸,隨后出現(xiàn)的幾起案子梅桩,更是在濱河造成了極大的恐慌,老刑警劉巖拜隧,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宿百,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡洪添,警方通過(guò)查閱死者的電腦和手機(jī)垦页,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)干奢,“玉大人痊焊,你說(shuō)我怎么就攤上這事》蘧” “怎么了薄啥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逛尚。 經(jīng)常有香客問(wèn)我垄惧,道長(zhǎng),這世上最難降的妖魔是什么绰寞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任到逊,我火速辦了婚禮,結(jié)果婚禮上克握,老公的妹妹穿的比我還像新娘蕾管。我一直安慰自己,他們只是感情好菩暗,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著旭蠕,像睡著了一般停团。 火紅的嫁衣襯著肌膚如雪旷坦。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天佑稠,我揣著相機(jī)與錄音秒梅,去河邊找鬼。 笑死舌胶,一個(gè)胖子當(dāng)著我的面吹牛捆蜀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幔嫂,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辆它,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了履恩?” 一聲冷哼從身側(cè)響起锰茉,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎切心,沒(méi)想到半個(gè)月后飒筑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绽昏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年协屡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片全谤。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡著瓶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啼县,到底是詐尸還是另有隱情材原,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布季眷,位于F島的核電站余蟹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏子刮。R本人自食惡果不足惜威酒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挺峡。 院中可真熱鬧葵孤,春花似錦、人聲如沸橱赠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狭姨。三九已至宰啦,卻和暖如春苏遥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赡模。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工田炭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漓柑。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓教硫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辆布。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞬矩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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