一、循環定義
一組被重復執行的語句稱之為 循環體,能否繼續重復,決定循環的終止條件。 循環語句 是由循環體及循環的終止條件兩部分組成的。
二、for循環
2.1 帶列表循環
語法
for 變量名 in 取值列表do 命令序列 done
花括號用法:
花括號{ }和seq在for循環的應用:
for i in {1..10..2} 1-10的奇數
for i in {0..10..2} 1-10的偶數
for i in {10..1} ?1-10倒序排列
for i in $(seq 10) ?1-10正序排列
for i in $(seq 10 -1 1) 1-10倒序排列
for i in $(seq 1 2 10) 1-10的奇數,中間為步長
?運用演示1:列表打印
? ?需求:打印一份一到十的數字列表
#!/bin/bashfor i in {1..10}
do
echo $i
done
運用演示二:分類打印
需求:打印一份 0-10以內的奇數列表
for i in {1..10..2}
do
echo $i
done
腳本
#!/bin/bash
for i in {1..10..2}
do
echo $i
done
?
?需求二:打印一份0-10以內的偶數列表
for i in {0..10..2}
> do
> echo $i
> done
用腳本寫
#!/bin/bash
for i in {0..10..2}
do
echo $i
done
?
運用演示三:累加求和?
需求:求從1加到10的和?
sum=0
for i in {1..10}
> do
> sum=$[sum+i]
> done
echo $sum
55
腳本求1加到100的和
#!/bin/bash
i=0
sum=0
for i in {1..100}
do
sum=$[sum +i]
let i++
done
echo $sum
?
?2.2 不帶列表循環
語法
for 變量名
do
命令
done
?運用演示:打印hello
#!/bin/bash
for i
do
echo hello
done
注意:腳本需要執行權限,i也要賦予一個值?
2.3 類似c語言格式的循環
語法
for ((表達式1;表達式2;表達式3))
do
命令
done
表達式1:定義變量并賦值表達式2:決定是否循環表達式3:決定循環變量如何改變,決定循環什么時候結束
配合命令let使用
++ 自身變量+1
-- 自身變量-1
+=5 自身變量+5
-=5 自身變量-5
*=5 自身變量*5
/=5 自身變量/5
%=5 自身變量%5
運用演示:從1+到100
#!/bin/bash
i=0
sum=0
for ((i=0;i<=100;i++))
do
sum=$[sum+i]
done
echo $sum
三、while 循環
3.1 while 語法結構
語法
while [ 判斷條件] 使用while循環滿足條件執行do,不滿足不執行 do 執行動作 while循環執行動作done while循環結束標志
應用演示:求和
#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
sum=$[sum+i]
let i++
done
echo $sum
3.2 死循環語句
1.while? [1? -eq? 1]? ?判斷條件寫一個永久為真的條件?
? ? do? ? ? ?一直執行do內的命令
? ? done
2.while? true? ? ? ? 直接寫判斷條件為真
? ? do? ? ? ?一直執行do內的命令
? ? done
3.while :? ? ? ? ?判斷條件為冒號也表示死循環
? ? do? ? ? ?一直執行do內的命令?
? ? done
四、雙重循環及跳出循環
4.1?雙重循環的機制
單層循環:執行命令從上至下依次執行命令,進行條件判斷,如果沒有達到退出循環的要求,
便再次進行該操作
雙重循環:循環中嵌套循環(在這里我們將外面的循環稱作外部循環,嵌套在里面的叫內部循環)
當外部循環執行一次時,內部循環就要將自身的所有循環進行一遍,一整個雙重循環結束后,內部循環執行的次數等于自己本身循環的所有次數乘以外部循環的所有循環次數
運用演示:
#!/bin/bash#這是一個雙重循環的測試實驗for ((i=1;i<=5;i++))
doecho "=============這是外部循環執行的第 $i 次==================== "for ((j=1;a<=5;j++))doecho "這是內部循環執行的第 $j 次" done
done
打印九九乘法表
#!/bin/bash
for((i=1;i<=9;i++))
dofor((j=1;j<=i;j++))doecho -e "${i}*${j}=$[i*j]\t\c"done
echo
done
4.2 跳出循環
????????break跳出單個循環 break n 數字數字是幾代表跳出n層循環
????????continue終止某次循環中的命令,但是不會完全終止命令
????????exit 直接退出腳本
4.2.1 continue跳出循環?
1.表示滿足continue條件時跳出循環,但是不影響后續循環執行
舉例:
vim test1.sh #創建腳本a.sh
腳本內容:
#!/bin/bash
for i in {1..10} #for循環10次從i=1開始到i=10
do
if [ $i -eq 3 ] #if判斷語句,若$1等于3則執行then的內容
then
continue #當$i=3時跳出循環但不影響后面循環
fi #結束if語句
echo $i #沒執行一次for循環輸出一次$i
done #for循環結束語句
bash test1.sh #調用shell執行腳本
輸出結果
1
2
4
5
6
7
8
9
10
4.2.2 break跳出循環
在某個循環中遇到break直接結束此次循環,但是不影響外邊嵌套的循環。
break? [數字] 結束數字中的幾次循環,若為2則結束自己所在循環和外邊嵌套的一層循環,若為3則結束自己所在循環和外邊嵌套的2層循環
舉例:
vim a.sh #創建a.sh腳本
腳本內容:
#!/bin/bash
for j in {1..3} #第一層for循環,j=1,2,3各執行一次do的內容
do #第一層for循環的執行內容for i in {1..5} #第二層for循環,i=1,2,3,4,5各執行一次do的內容do #第二層for循環的執行內容 if [ $i -eq 3 ] #第二層for循環中添加的if判斷語句,當$i=3是執行then內容then break #第二層for循環判斷語句執行命令,break結束循環fi #if語句結束echo "$i" #第二層for循環語句執行每循環一次輸出$idone #第二層for循環語句結束標志
done #第一層for循環語句結束標志
bash a.sh #調用bash執行a.sh腳本
執行結果:第二層執行在$i=3是結束了循環,所以只能輸出1和2,第一層for循環是循環3次,所以輸出了3次。
1
2
1
2
1
2
4.2.3 exit跳出腳本
#!/bin/bash
for j in {1..3} #第一層for循環,j=1,2,3各執行一次do的內容
do #第一層for循環的執行內容for i in {1..5} #第二層for循環,i=1,2,3,4,5各執行一次do的內容do #第二層for循環的執行內容 if [ $i -eq 3 ] #第二層for循環中添加的if判斷語句,當$i=3是執行then內容then#break #第二層for循環判斷語句執行命令,break結束循環exit 第二層for循環判斷語句執行命令,exit結束循環fi #if語句結束echo "$i" #第二層for循環語句執行每循環一次輸出$idone #第二層for循環語句結束標志
done #第一層for循環語句結束標志
?五、until循環
until循環與for,while循環不同的是,until循環是只要條件不符合就會一直循環,直到條件符合后才會退出循環
語句格式:until 條件測試操作 do 命令序列 done
運用演示:求和
#!/bin/bash
i=0
sum=0
until [ $i -gt 100 ]
do
sum=$[sum+i]
let i++
done
echo $sum
總結:
1. 掌握好三種循環的用法(特別是until和前兩種循環對于條件判斷是相反的)?
2.for循環讀取文件時,如果遇到未按照默認分隔符隔開的文件,可以通過修改分隔符來實現正常讀取(但是先備份分隔符的默認值,再進行修改,最后進行還原)