循环语句通常需要有一个进入条件和一个退出条件
1.for循环
for循环当列表不为空时进入循环,否则退出循环
for ((expr1;expr2;expr3)) { 循环体 } for (( expr1 ; expr2 ; expr3 ));do 循环体 done expr1 //用于指定初始条件,给控制变量一个初始值 expr2 //判定什么时候退出循环 expr3 //修正expr1指定的变量的值 例一和例二效果一样 例一: [root@ansible ~]# cat test.sh #!/bin/bash for ((i=1;i<=6;i++)){ echo $i } [root@ansible ~]# ./test.sh 1 2 3 4 5 6 例二: [root@ansible ~]# cat test.sh #!/bin/bash for ((i=1;i<=6;i++));do echo $i done [root@ansible ~]# ./test.sh 1 2 3 4 5 6 例三: for 变量 in 列表; do 循环体 done [root@ansible ~]# cat test.sh #!/bin/bash for i in $(seq 10);do echo $i done [root@ansible ~]# ./test.sh 1 2 3 4 5 6 7 8 9 10 //如何生成列表: {1..100} seq [起始数] [步进长度] 结束数 [root@ansible ~]# echo {1..100} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 [root@ansible ~]# seq 100 1 2 略 100 [root@ansible ~]# seq 1 2 10 1 3 5 7 92.while循环
while循环适用于循环次数未知的场景,注意要有退出条件。 条件满足时进入循环,条件不满足了退出循环。
2.1 while循环正常用法
例一: while 条件; do statement ... done [root@ansible ~]# cat test.sh #!/bin/bash i=0 while [ $i -le 10 ];do echo $i let i++ done [root@ansible ~]# ./test.sh 0 1 2 3 4 5 6 7 8 9 10 例二:while循环加上if条件判断 [root@ansible ~]# cat test.sh #!/bin/bash i=1 fiag=true while $flag;do echo $i let i++ if [ $i -gt 10 ];then flag=false fi done2.2 while循环特殊用法
while循环特殊用法一:死循环(用true的方式) [root@ansible ~]# cat test.sh #!/bin/bash i=0 while true;do echo $i let i++ done while循环特殊用法二:死循环(用冒号的方式) [root@ansible ~]# cat test.sh #!/bin/bash i=0 while :;do echo $i let i++ done while循环特殊用法三:逐行读取某文件,将值存入line变量中 [root@ansible ~]# cat test.sh #!/bin/bash i=1 while read line;do echo $line let i++ done < anaconda-ks.cfg echo $i //统计行数 [root@ansible ~]# ./test.sh #version=RHEL8 ignoredisk --only-use=nvme0n1 autopart --type=lvm # Partition clearing information clearpart --none --initlabel # Use graphical install graphical # Use CDROM installation media cdrom # Keyboard layouts keyboard --vckeymap=us --xlayouts='us' # System language lang en_US.UTF-8 # Network information network --bootproto=dhcp --device=ens33 --ipv6=auto --activate network --hostname=localhost.localdomain repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream # Root password rootpw --iscrypted $6$Xfd/a8ZHAs2gT/9P$NntVxEpGyzITZUd57hM9/wb1sfuxKxXgowaIRyzj9.VP2XysEYFq.qS4eBMBFgdskLJD1xNUUdfYFKaYm6zzt/ # Run the Setup Agent on first boot firstboot --enable # Do not configure the X Window System skipx # System services services --disabled="chronyd" # System timezone timezone Asia/Shanghai --isUtc --nontp %packages @^minimal-environment %end %addon com_redhat_kdump --disable --reserve-mb='auto' %end %anaconda pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty %end 44 //行数3.1循环语句特殊情况
在循环语句中,有几种特别情况:
break [num]:提前退出循环。当循环语句中出现break时,将提前退出循环,不再执行循环后面的语句 [root@ansible ~]# cat test.sh #!/bin/bash for i in $(seq 10);do if [ $i -gt 5 ];then break fi echo $i done [root@ansible ~]# ./test.sh 1 2 3 4 5continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环
[root@ansible ~]# cat test.sh #!/bin/bash for i in $(seq 10);do if [ $i -eq 5 ];then continue fi echo $i done [root@ansible ~]# ./test.sh 1 2 3 4 6 7 8 9 10