? ? 循環(huán)語(yǔ)句常用于重復(fù)執(zhí)行一條命令或一組命令等扇丛,直到達(dá)到結(jié)束條件后筒严,則終止執(zhí)行丹泉。在Shell中常見(jiàn)的循環(huán)命令有while、until萝风、for和select等嘀掸。
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枪孩、exit、return藻肄。
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