如何用示例在 Bash 中編寫循環

如何實現自動化 bash Linux/UNIX操作系統下的for循環? 如何使用 break、continue 和循環控製表達式的參數? 如何使用for循環處理文件?

For 循環是解決編程世界中許多問題的非常有用的工具,因此我們將解決現實世界中的一些問題。 在 Linux 中,我們通過 Bash、Python 使用循環來製作密碼腳本、計數腳本等自動化。 在本文中,我們將解釋 Bash 的所有類型的循環。

1) for 循環

我們可以使用 For 循環讀取列表中的所有元素或其中的一部分,並將這些元素顯示在屏幕上。

For 循環的語法

對於 element1 element2 element3 或 中的變量

命令
完畢

我們將製作一個腳本來為一周中的每一天發送問候消息,因此我們將使用 for 每天循環閱讀並打印出來。 創建文件 welcome.shnano 編輯器並粘貼下面的代碼。

#!/bin/bash
for day in Sunday Saturday Monday Tuesday Wednesday Thursday Friday
do
echo "Welcome $day day"
done

跑過 welcome.sh 文件與 bash 命令。

$ bash welcome.sh

output
Welcome Sunday day
Welcome Saturday day
Welcome Monday day
Welcome Tuesday day
Welcome Wednesday day
Welcome Thursday day
Welcome Friday day

for 循環會分別取列表中的每一項,並將該項賦給變量 $day,然後執行之間的代碼 dodone 然後返回頂部,分配列表中的下一項並重複。

我們可以使用帶有 for 循環的範圍來放置起點和終點。

#!/bin/bash
for i in {10..20}
do
echo "Welcome $i times"
done

$ bash range.sh

output
Welcome 10 times
Welcome 11 times
Welcome 12 times
Welcome 13 times
Welcome 14 times
Welcome 15 times
Welcome 16 times
Welcome 17 times
Welcome 18 times
Welcome 19 times
Welcome 20 times

如果我們想從 1 到 20 計算偶數,我們將為範圍添加步長。

#!/bin/bash
for i in {10..20..2}
do
echo "Welcome $i times"
done

$ bash even.sh

output
Welcome 10 times
Welcome 12 times
Welcome 14 times
Welcome 16 times
Welcome 18 times
Welcome 20 times

另一種在 for 循環中使用 step 的類型。

#!/bin/bash
for ((i=1;i<=25;i+=5))
do
echo $i
done

$ bash step5.sh

output
1
6
11
16
21

對於否定步驟,我們可以使用以下類型。

#!/bin/bash
for ((i=25;i>=1;i-=5))
do
echo $i
done

$ bash step-5.sh

output
25
20
15
10
5

For 循環示例

1) 使用 for 循環作用於文件

當我們處理文件時,Bash For 循環是最好的方法。

#!/bin/bash
for file in ~/*.txt
do
echo $file
done

$ bash find_txt.sh

output
/root/cat.txt
/root/echo.txt
/root/file.txt
/root/f.txt
/root/nano.txt
/root/printf.txt

2) 一行 For 循環

我們可以在一行中執行 For 循環,我們將重命名所有 *.txt files 以刪除文件擴展名。

$ for filename in *.txt; do mv "$filename" "${filename%.txt}"; done

或者在腳本中

!#/bin/bash
for filename in *.txt
do
mv "$filename" "${filename%.txt}"
done

3) 讀取命令行參數

當我們執行 For 循環腳本時,我們可以輸入參數。

for myvalue in $*
do
echo "Argument: $myvalue"
done

$ bash linoxide.sh I Love LinOxide

output
Argument: I
Argument: Love
Argument: LinOxide

4) 讀奇偶數

我們將編寫腳本來讀取偶數和奇數。

for (( n=10; n<=15; n++ ))
do
if (( $n%2==0 ))
then
echo "$n is even"
else
echo "$n is odd"
fi
done

$ bash even_odd.sh

output
10 is even
11 is odd
12 is even
13 is odd
14 is even
15 is odd

2)while循環

While 循環依賴於條件為真,如果條件為假,解釋器退出循環。

while 循環的語法

儘管 [ <some condition> ]做
<命令>
完畢

我們將從 10 數到 20 並打印出結果。 所以我們將設置一個條件,即計數器小於或等於 20。

#!/bin/bash
# Basic while loop
counter=10
while [ $counter -le 20 ]
do
echo Number : $counter
((counter++))
done

$ bash while.sh

output
Number : 10
Number : 11
Number : 12
Number : 13
Number : 14
Number : 15
Number : 16
Number : 17
Number : 18
Number : 19
Number : 20

3)直到循環

直到循環類似於 while 循環,但解釋器執行其中的命令,直到條件變為真。

直到循環的語法

直到 [ <some condition> ]做
<命令>
完畢

我們將從 10 數到 20 並打印出結果。 所以我們將設置一個條件,即計數器大於或等於 20。

#!/bin/bash
# Basic Until loop
counter=10
until [ $counter -gt 20 ]
do
echo Number : $counter
((counter++))
done

$ bash 直到.sh

output
Number : 10
Number : 11
Number : 12
Number : 13
Number : 14
Number : 15
Number : 16
Number : 17
Number : 18
Number : 19
Number : 20

4) 控制迴路

我們可以用 Break 或者 Continue 來控制循環。

中斷聲明

為了 Break 語句,我們可以退出循環,使用時不需要完成循環 if 循環內的語句。

#!/bin/bash
# Basic loop use break
counter=10
until [ $counter -gt 20 ]
do
echo Number : $counter
if [ $counter -eq 15 ]
then
echo Done
break
fi
((counter++))
done

$ bash break.sh

output
Number : 10
Number : 11
Number : 12
Number : 13
Number : 14
Number : 15
Done

繼續聲明

為了 Continue 語句,我們可以繼續循環,在我們使用時不需要完成循環 if 循環內的語句。

#!/bin/sh

NUMS="1 2 3 4 5 6 7"

for NUM in $NUMS
do
Q=`expr $NUM % 2`
if [ $Q -eq 0 ]
then
echo "A number is an even number!!"
continue
fi
echo "Found odd number"
done

$ bash continue.sh

output
Found odd number
A number is an even number!!
Found odd number
A number is an even number!!
Found odd number
A number is an even number!!
Found odd number

5) 選擇循環

Select 循環類似於 while 和 until 循環,但允許您創建一個簡單的菜單系統。

選擇循環的語法

中選擇 var

<命令>
完畢

我們將做出三個選項並使用 select 循環從中選擇。

#!/bin/bash
# select script

PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you choose choice 1"
;;
"Option 2")
echo "you choose choice 2"
;;
"Option 3")
echo "you choose choice $REPLY which is $opt"
;;
"Quit")
break
;;
*) echo "invalid option $REPLY";;
esac
done

$ bash select.sh

output
1) Option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 1
you chose choice 1
Please enter your choice: 5
invalid option 5
Please enter your choice: 4

結論

  1. Bash For 循環用於同步、製作密碼、備份等…
  2. Do while 與 while 相同,但解釋器不帶任何條件執行第一個代碼
  3. Break 語句對於跳出循環非常重要
  4. 當我們有很多選項時,Select 語句很有用

另請閱讀:

  • Linux中Shebang的作用是什麼?
  • 70 個 Shell 腳本面試問題和答案