亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

shell for循環

發布時間:2020-05-31 11:31:54 來源:網絡 閱讀:853 作者:大阿鵬 欄目:系統運維

除了 while 循環和 until 循環,Shell 腳本還提供了 for 循環,它更加靈活易用,更加簡潔明了。Shell?for 循環有兩種使用形式,下面我們逐一講解。

C語言風格的 for 循環

C語言風格的 for 循環的用法如下:

for((exp1; exp2; exp3))
do
??? statements
done


幾點說明:

exp1、exp2、exp3 是三個表達式,其中 exp2 是判斷條件,for 循環根據 exp2 的結果來決定是否繼續下一次循環;
statements 是循環體語句,可以有一條,也可以有多條;
do 和 done 是 Shell 中的關鍵字。


它的運行過程為:
1) 先執行 exp1。

2) 再執行 exp2,如果它的判斷結果是成立的,則執行循環體中的語句,否則結束整個 for 循環。

3) 執行完循環體后再執行 exp3。

4) 重復執行步驟 2) 和 3),直到 exp2 的判斷結果不成立,就結束循環。


上面的步驟中,2) 和 3) 合并在一起算作一次循環,會重復執行,for 語句的主要作用就是不斷執行步驟 2) 和 3)。

exp1 僅在第一次循環時執行,以后都不會再執行,可以認為這是一個初始化語句。exp2 一般是一個關系表達式,決定了是否還要繼續下次循環,稱為“循環條件”。exp3 很多情況下是一個帶有自增或自減運算的表達式,以使循環條件逐漸變得“不成立”。

for 循環的執行過程可用下圖表示:

shell for循環


下面我們給出一個實際的例子,計算從 1 加到 100 的和。

#!/bin/bash

sum=0

for ((i=1; i<=100; i++))
do
((sum += i))
done

echo "The sum is: $sum"

運行結果:
The sum is: 5050


代碼分析:
1) 執行到 for 語句時,先給變量 i 賦值為 1,然后判斷 i<=100 是否成立;因為此時 i=1,所以 i<=100 成立。接下來會執行循環體中的語句,等循環體執行結束后(sum 的值為1),再計算 i++。

2) 第二次循環時,i 的值為2,i<=100 成立,繼續執行循環體。循環體執行結束后(sum的值為3),再計算 i++。

3) 重復執行步驟 2),直到第 101 次循環,此時 i 的值為 101,i<=100 不再成立,所以結束循環。


由此我們可以總結出 for 循環的一般形式為:

for(( 初始化語句; 判斷條件; 自增或自減 ))
do
? ? statements
done

for 循環中的三個表達式

for 循環中的 exp1(初始化語句)、exp2(判斷條件)和 exp3(自增或自減)都是可選項,都可以省略(但分號;必須保留)。


1) 修改“從 1 加到 100 的和”的代碼,省略 exp1:
#!/bin/bash

sum=0
i=1

for ((; i<=100; i++))
do
((sum += i))
done

echo "The sum is: $sum

"
可以看到,將i=1移到了 for 循環的外面。


2) 省略 exp2,就沒有了判斷條件,如果不作其他處理就會成為死循環,我們可以在循環體內部使用 break 關鍵字強制結束循環:
#!/bin/bash

sum=0

for ((i=1; ; i++))
do
if(( i>100 )); then
break
fi
((sum += i))
done

echo "The sum is: $sum"

break 是 Shell 中的關鍵字,專門用來結束循環,后續章節還會深入講解。


3) 省略了 exp3,就不會修改 exp2 中的變量,這時可在循環體中加入修改變量的語句。例如:


#!/bin/bash

sum=0

for ((i=1; i<=100; ))
do
((sum += i))
((i++))
done

echo "The sum is: $sum"



4) 最后給大家看一個更加極端的例子,同時省略三個表達式:


#!/bin/bash

sum=0
i=0

for (( ; ; ))
do
if(( i>100 )); then
break
fi
((sum += i))
((i++))
done

echo "The sum is: $sum"


這種寫法并沒有什么實際意義,僅僅是為了給大家做演示。

Python?風格的 for in 循環

Python 風格的 for in 循環的用法如下:

for?variable in value_list
do
??? statements
done

variable 表示變量,value_list 表示取值列表,in 是 Shell 中的關鍵字。

in value_list 部分可以省略,省略后的效果相當于 in $@,本文末尾的「value_list 使用特殊變量」將會詳細講解。

每次循環都會從?value_list 中取出一個值賦給變量?variable,然后進入循環體(do 和 done 之間的部分),執行循環體中的?statements。直到取完?value_list 中的所有值,循環就結束了。

Shell for in 循環舉例:


?
#!/bin/bash

sum=0

for n in 1 2 3 4 5 6
do
echo $n
((sum+=n))
done

echo "The sum is "$sum


運行結果:
1
2
3
4
5
6
The sum is 21

對?value_list 的說明


取值列表 value_list 的形式有多種,你可以直接給出具體的值,也可以給出一個范圍,還可以使用命令產生的結果,甚至使用通配符,下面我們一一講解。

1) 直接給出具體的值

可以在 in 關鍵字后面直接給出具體的值,多個值之間以空格分隔,比如1 2 3 4 5、"abc" "390" "tom"等。

上面的代碼中用一組數字作為取值列表,下面我們再演示一下用一組字符串作為取值列表:


?
#!/bin/bash

for i in "abc" "123" "qwe" "我愛你"
do
echo $i
done
運行結果:
abc

123

qwe

我愛你


2) 給出一個取值范圍

給出一個取值范圍的具體格式為:

{start..end}

start 表示起始值,end 表示終止值;注意中間用兩個點號相連,而不是三個點號。根據筆者的實測,這種形式只支持數字和字母。

例如,計算從 1 加到 100 的和:


?
#!/bin/bash

sum=0

for n in {1..100}
do
((sum+=n))
done

echo $sum


運行結果:
5050

再如,輸出從 A 到 z 之間的所有字符:


?
#!/bin/bash

for c in {A..z}
do
printf "%c" $c
done


輸出結果:
ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz

可以發現,Shell 是根據?ASCII?碼表來輸出的。

3) 使用命令的執行結果

使用反引號``或者$()都可以取得命令的執行結果,我們在《Shell變量》一節中已經進行了詳細講解,并對比了兩者的優缺點。本節我們使用$()這種形式,因為它不容易產生混淆。

例如,計算從 1 到 100 之間所有偶數的和:


?
#!/bin/bash

sum=0

for n in $(seq 2 2 100)
do
((sum+=n))
done

echo $sum


運行結果:
2550

seq 是一個?Linux 命令,用來產生某個范圍內的整數,并且可以設置步長,不了解的讀者請自行百度。seq 2 2 100表示從 2 開始,每次增加 2,到 100 結束。

再如,列出當前目錄下的所有 Shell 腳本文件:


?
#!/bin/bash

for filename in $(ls *.sh)
do
echo $filename
done


運行結果:
demo.sh
test.sh
abc.sh

ls 是一個?Linux?命令,用來列出當前目錄下的所有文件,*.sh表示匹配后綴為.sh的文件,也就是 Shell 腳本文件。

4) 使用 Shell 通配符

Shell 通配符可以認為是一種精簡化的正則表達式,通常用來匹配目錄或者文件,而不是文本,不了解的讀者請猛擊《Linux Shell 通配符(glob 模式)》。

有了 Shell 通配符,不使用 ls 命令也能顯示當前目錄下的所有腳本文件,請看下面的代碼:


?
#!/bin/bash

for filename in *.sh
do
echo $filename
done


運行結果:
demo.sh
test.sh
abc.sh




?



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大余县| 绥阳县| 武汉市| 华宁县| 舞钢市| 政和县| 拉孜县| 防城港市| 禹州市| 承德县| 白朗县| 淮北市| 边坝县| 宿迁市| 望谟县| 中阳县| 沙坪坝区| 庆城县| 镇沅| 湖口县| 信宜市| 吴旗县| 尼玛县| 玛曲县| 弥勒县| 新丰县| 光泽县| 博野县| 丰县| 新乐市| 澄江县| 青神县| 桂阳县| 仙居县| 南漳县| 寻乌县| 阿荣旗| 开阳县| 扬州市| 临猗县| 耒阳市|