shell for循環

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

C語言風格的 for 循環

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

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

幾點說明:正則表達式

  • exp一、exp二、exp3 是三個表達式,其中 exp2 是判斷條件,for 循環根據 exp2 的結果來決定是否繼續下一次循環;shell

  • statements 是循環體語句,能夠有一條,也能夠有多條;bash

  • do 和 done 是 Shell 中的關鍵字。ide


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

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

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

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

上面的步驟中,2) 和 3) 合併在一塊兒算做一次循環,會重複執行,for 語句的主要做用就是不斷執行步驟 2) 和 3)。

exp1 僅在第一次循環時執行,之後都不會再執行,能夠認爲這是一個初始化語句。exp2 通常是一個關係表達式,決定了是否還要繼續下次循環,稱爲「循環條件」。exp3 不少狀況下是一個帶有自增或自減運算的表達式,以使循環條件逐漸變得「不成立」。

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

url

Shell for循環執行流程


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

#!/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 循環的通常形式爲:
.net

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

for 循環中的三個表達式

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

1) 修改「從 1 加到 100 的和」的代碼,省略 exp1:


 
  1. #!/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 關鍵字強制結束循環:


 
  1. #!/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 中的變量,這時可在循環體中加入修改變量的語句。例如:


 
  1. #!/bin/bash

    sum=0

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

    echo "The sum is: $sum"



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


 
  1. #!/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 循環舉例:


 
  1. #!/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"等。

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


 
  1. #!/bin/bash


  2. for i in "abc" "123" "qwe" "我愛你"

  3. do

  4. echo $i

  5. done

運行結果:
abc

123

qwe

我愛你


2) 給出一個取值範圍

給出一個取值範圍的具體格式爲:

{start..end}

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

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


 
  1. #!/bin/bash

    sum=0

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

    echo $sum


運行結果:
5050

再如,輸出從 A 到 z 之間的全部字符:


 
  1. #!/bin/bash

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


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

能夠發現,Shell 是根據 
ASCII 碼錶來輸出的。

3) 使用命令的執行結果

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

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


 
  1. #!/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 腳本文件:


 
  1. #!/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 命令也能顯示當前目錄下的全部腳本文件,請看下面的代碼:


 
  1. #!/bin/bash

    for filename in *.sh
    do
    echo $filename
    done


運行結果:demo.shtest.shabc.sh

相關文章
相關標籤/搜索