この記事はBashの記事シリーズの続きであり、反復に焦点を当てています。 Bashのループは、システム管理者やプログラマーにとって便利です。任意のスクリプト言語のループ構造により、複数のコマンドを実行し、特定の状況に達するまで再実行を続けることができます。簡単に言うと、ループは反復的なタスクを自動化するのに役立ちます。シェルスクリプト言語には、次の3つのループ構造があります。
- 中 -ループ。
- 対象 -ループ。
- まで -ループ。
for -loopは、一連のアクションを実行するために使用されるBash言語の反復ステートメントです。シェルプロンプトまたはシェルスクリプト自体の中で使用できます。アイテムのリストを操作し、リスト内のすべてのアイテムに対して一連のコマンドを繰り返します。

基本的な構文を以下に示します。
for item in [LIST]
do
COMMANDS
done
場所:
- リスト スペースで区切られた一連の文字列または数字です。
- コマンド アイテムのリストに対して実行されるコマンドのセットです。
- for 、 in 、実行 および完了 ループ構文のキーワードです。
- アイテム リストからアイテムにアクセスするために使用されるBash変数名です。


このタイプのループを使用して、リストが使い果たされるまで一連の数値または数値リストを反復処理できます。
次の例では、数字を繰り返し処理します 1 2 3 4 5 。
#!/bin/bash
for var in 1 2 3 4 5
do
echo "Number is $var"
done
次の出力が得られるはずです:
Number is 1
Number is 2
Number is 3
Number is 4
Number is 5
上記の例では、 for -loopはリストから各アイテムを取得し、それらを変数 varに格納します 、実行の間のコマンドを実行します および完了 。
値の範囲を定義することにより、数値の範囲を指定することもできます。

次の例では、 10の間のすべての数値を繰り返し処理します。 および15 。
#!/bin/bash
for var in {10..15}
do
echo "Number is $var"
done
次の出力が得られるはずです:
Number is 10
Number is 11
Number is 12
Number is 13
Number is 14
Number is 15
ループ内で特定の範囲を使用する場合、増分を指定して各数値を増分することもできます。

次の例では、 0からの数値の範囲を繰り返し処理します。 〜 10 各数値を2ずつ増やします :
#!/bin/bash
for var in {0..10..2}
do
echo "Number is $var"
done
次の出力が得られるはずです:
Number is 0
Number is 2
Number is 4
Number is 6
Number is 8
Number is 10

ループを使用して、文字列のリストを反復処理することもできます。
次の例では、文字列のリストを1つずつ繰り返します。
#!/bin/bash
for month in Jan Feb Mar Apr May Jun
do
echo "Month is $month"
done
次の出力が得られるはずです:
Month is Jan
Month is Feb
Month is Mar
Month is Apr
Month is May
Month is Jun

次の例では、 CARSのすべての要素を繰り返し処理します。 配列:
#!/bin/bash
CARS=('Maruti' 'Toyota' 'BMW' 'Tata' 'Datsun')
for car in "${CARS[@]}"; do
echo "Car: $car"
done
次の出力が得られるはずです:
Car: Maruti
Car: Toyota
Car: BMW
Car: Tata
Car: Datsun

次の例では、 for -loopsは、平日の配列内のすべての要素を繰り返します。
#!/bin/bash
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
echo "Weekday $((i++)): $day"
done
次の出力が得られるはずです:
Weekday 1: Mon
Weekday 2: Tue
Weekday 3: Wed
Weekday 4: Thu
Weekday 5: Fri
空の式を使用して無限ループを作成できます。
#!/bin/bash
for (( ; ; ))
do
echo "Infinite Loops [ press CTRL+C to stop]"
done
次の出力が得られるはずです:
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
CRTL + Cを押すことができます 無限ループを停止します。
ブレークを使用できます ループを早く終了するステートメント。
次の例では、 20の間の数字を繰り返し処理します 〜 30 。 ifを使用します -現在の反復アイテムが27に等しくなると、ループを終了するステートメント 。
#!/bin/bash
for var in {20..30}
do
if [[ "$var" == '27' ]]; then
break
fi
echo "Number is: $var"
done
次の出力が得られるはずです:
Number is: 20
Number is: 21
Number is: 22
Number is: 23
Number is: 24
Number is: 25
Number is: 26
continueステートメントはループ内で使用されます。ループ内でcontinueステートメントが検出されると、制御フローは次の反復のループの先頭にジャンプし、現在の反復のループ本体内のステートメントの実行をスキップします。
次の例では、 10の間の数字を繰り返し処理します 〜 15 。現在の反復アイテムが13に等しい場合 、continueステートメントは実行を停止し、ループの最初に戻り、次の反復を続行します:
#!/bin/bash
for var in {10..15}
do
if [[ "$var" == '13' ]]; then
continue
fi
echo "Number is: $var"
done
次の出力が得られるはずです:
Number is: 10
Number is: 11
Number is: 12
Number is: 14
Number is: 15
このセクションでは、ディレクトリ内のすべてのファイルの拡張子を変更する方法を説明します。
次の例では、現在のディレクトリ内のすべてのファイルの拡張子を .phpから変更します。 .htmlへ 。
#!/bin/bash
for file in *.php; do
mv "$file" "${file%.php}.html"
echo $file is renamed to "${file%.php}.html"
done
次の出力が得られるはずです:
admin.php is converted to admin.html
ajax.php is converted to ajax.html
composer.php is converted to composer.html
index.php is converted to index.html
login.php is converted to login.html
この例では、現在のシステム時刻を2秒ごとに表示します。
#!/bin/bash
for now in {1..5}
do
date
sleep 2
done
次の出力が得られるはずです:
Fri Dec 4 12:19:10 IST 2020
Fri Dec 4 12:19:12 IST 2020
Fri Dec 4 12:19:14 IST 2020
Fri Dec 4 12:19:16 IST 2020
Fri Dec 4 12:19:18 IST 2020
同じ拡張子を持つすべてのファイルに対して同じアクションを実行できます。たとえば、ディレクトリ内の複数のファイルを解凍してみましょう。
次の例では、現在のディレクトリ内にあるすべてのtarファイルを抽出します。
#!/bin/bash
for var in *.tar
do
echo "Processing $var..."
tar -xf "$var"
done
ループ式を使用して、リストから複数のサーバーにpingを実行できます。
まず、以下に示すように、domain.txtという名前のファイルを作成し、このファイルにすべてのサーバーを追加します。
cat domain.txt
次の行を追加します:
google.com
facebook.com
yahoo.com
wordpress.com
次に、以下に示すように、domain.txtファイルにリストされているすべてのサーバーにpingを実行しましょう。
#!/bin/bash
for var in $(cat domain.txt)
do
ping -c 1 "$var"
done
次の出力が得られるはずです:
PING google.com (216.58.203.14) 56(84) bytes of data.
64 bytes from hkg12s09-in-f14.1e100.net (216.58.203.14): icmp_seq=1 ttl=117 time=119 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 119.469/119.469/119.469/0.000 ms
PING facebook.com (69.171.250.35) 56(84) bytes of data.
64 bytes from edge-star-mini-shv-01-any2.facebook.com (69.171.250.35): icmp_seq=1 ttl=56 time=43.9 ms
--- facebook.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 43.994/43.994/43.994/0.000 ms
PING yahoo.com (74.6.231.21) 56(84) bytes of data.
64 bytes from media-router-fp74.prod.media.vip.ne1.yahoo.com (74.6.231.21): icmp_seq=1 ttl=51 time=371 ms
--- yahoo.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 371.135/371.135/371.135/0.000 ms
PING wordpress.com (192.0.78.9) 56(84) bytes of data.
64 bytes from 192.0.78.9: icmp_seq=1 ttl=56 time=40.1 ms
--- wordpress.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 40.162/40.162/40.162/0.000 ms
これは、特定の条件に一致する特定のディレクトリ内のすべてのファイルを一覧表示する方法を示す例です。
たとえば、すべての .confを一覧表示します / etc内のファイル aで始まるディレクトリ 、 b 、 c またはd 文字:
#!/bin/bash
i=1
for file in /etc/[abcd]*.conf
do
echo "File $((i++)) : $file"
done
次の出力ですべてのファイルのリストを取得する必要があります:
File 1 : /etc/adduser.conf
File 2 : /etc/apg.conf
File 3 : /etc/blkid.conf
File 4 : /etc/brltty.conf
File 5 : /etc/ca-certificates.conf
File 6 : /etc/colord.conf
File 7 : /etc/debconf.conf
File 8 : /etc/deluser.conf
この記事では、Bashをに使用するさまざまな例について説明しました。 -ループ。これで、自分の日常のタスクを自動化する方法についてのアイデアが得られたことを願っています。記事が役に立った場合は、世界に広めるのを手伝ってください。