FOR 迴圈與 WHILE 陳述

Bash 指令稿入門

Alex Scriven

Data Scientist

基本 FOR 迴圈結構

Python:

for x in range(3):
    print(x)
0
1
2

R:

for (x in seq(3)){
    print(x)
}
[1] 1
[1] 2
[1] 3
Bash 指令稿入門

Bash 中的 FOR 迴圈

Bash 的基本結構相似:

for x in 1 2 3

do echo $x done
1
2
3
Bash 指令稿入門

FOR 迴圈的數字範圍

Bash 有個方便的數值範圍寫法,稱為「大括號展開」:

  • {START..STOP..INCREMENT}
for x in {1..5..2}

do echo $x done
1
3
5
Bash 指令稿入門

FOR 迴圈三段式語法

另一種常見寫法是「三段式」語法。

  • 以雙層括號包住三個表達式
  • 第一段為起始表達式(x=2
  • 中間為終止條件(x<=4
  • 最後為遞增(或遞減)表達式(x+=2

 

 

for ((x=2;x<=4;x+=2))
do 
    echo $x
done
2
4
Bash 指令稿入門

Glob 展開

Bash 也能用 * 進行樣式比對展開,例如目錄中的檔案。

例如,假設資料夾 /books 中有兩個文字檔:

for book in books/*
do  
    echo $book
done
books/book1.txt
books/book2.txt
Bash 指令稿入門

殼中殼再訪

還記得用 $() 建立「殼中殼」嗎?

你可以直接在 for 迴圈裡呼叫!

假設資料夾結構如下:

books 目錄結構

Bash 指令稿入門

殼中殼搭配 FOR 迴圈

我們可以針對殼中殼的結果進行迴圈:

for book in $(ls books/ | grep -i 'air')

do echo $book done
AirportBook.txt
FairMarketBook.txt
Bash 指令稿入門

WHILE 陳述語法

類似 FOR 迴圈,但你會設定一個每次迭代都要測試的條件。

只要條件成立就持續迭代!

  • 使用 while 取代 for
  • 用方括號包住條件
    • 數值比較沿用 IF 陳述的旗標(如 -le
  • 可串接多個條件,或像 IF 一樣用雙中括號並搭配 &&(AND)或 ||(OR)
  • 務必在程式碼中讓狀態改變以觸發停止(否則會變成無限迴圈!)
Bash 指令稿入門

WHILE 陳述範例

來看個簡單例子:

x=1

while [ $x -le 3 ];
do echo $x ((x+=1)) done
1
2
3
Bash 指令稿入門

留意無限迴圈

小心無限 WHILE 迴圈,當中止條件永遠不成立時就會發生。

x=1
while [ $x -le 3 ]; 
do
    echo $x
    # 不要遞增 x。它永遠到不了 3!
    # ((x+=1)) 
done

這會一直印出 1!

Bash 指令稿入門

一起來練習吧!

Bash 指令稿入門

Preparing Video For Download...