無限ループに注意してください!
ループする機能は、bashスクリプトの非常に強力な機能です。ループにはさまざまなユースケースがあります。
このチュートリアルでは、3つの異なるbashループ構造について説明します。また、ループを使用して配列要素をトラバースする方法についても学習します。
さらに、breakステートメントとcontinueステートメントを使用してループを制御する方法を学習し、最後に、無限ループを作成する方法を学習します。
forループは、bashで使用できる3種類のループ構造の1つです。 forループの記述には2つの異なるスタイルがあります。
- Cスタイルのforループ
- アイテムのリスト/範囲でforループを使用する
BashのCスタイルのForループ
プログラミング言語のようなCまたはC++に精通している場合は、次のforループ構文に気付くでしょう。
for ((initialize ; condition ; increment)); do
[COMMANDS]
done
前述のCスタイルの構文を使用すると、次のforループで「HelloFriend」が10回出力されます。
for ((i = 0 ; i < 10 ; i++)); do
echo "Hello Friend"
done
forループは最初に整数変数iを初期化しました ゼロにすると、条件(i <10)がテストされます。; trueの場合、ループは echo“ Hello Friend”の行を実行します 変数をインクリメントしますi 1による 、その後、ループは iまで何度も実行されます 10以上 。
[email protected]:~$ bash hello.sh
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
forループの別の構文バリエーションも存在します。これは、ファイル(または文字列)のリスト、数値の範囲、配列、コマンドの出力などを操作する場合に特に便利です。ループのリスト/範囲の構文は次の形式になります。 :
for item in [LIST]; do
[COMMANDS]
done
たとえば、次のforループは、前のセクションで作成したCスタイルのforループとまったく同じことを行います。
for i in {1..10}; do
echo "Hello Friend"
done
var.sh 以下のスクリプトは、 / varの下に存在するすべてのファイルとディレクトリを出力します ディレクトリ:
#!/bin/bash
for i in /var/*; do
echo $i
done
以下は、var.shスクリプトを実行したときの出力例です。
[email protected]:~$ ./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp
whileループは、bashスクリプトで使用できるもう1つの一般的で直感的なループです。 whileループの一般的な構文は次のとおりです。
while [ condition ]; do
[COMMANDS]
done
たとえば、次の 3x10.sh スクリプトは、数値3の最初の10倍を出力するwhileループを使用します。
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
上記のスクリプトの出力は次のとおりです。
[email protected]:~$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30
最初にnumを初期化しました 1に可変;次に、whileループは numの間実行されます 10以下 。 whileループの本体内で、echoコマンドは numを出力します 3を掛ける 次に、 numをインクリメントします 1による 。
C / C ++のバックグラウンドを使用している場合は、do-whileループを探している可能性がありますが、そのループはbashには存在しません。
bashには別の種類のループがあります。 untilループは、whileループと同じ構文に従います。
until [ condition ]; do
[COMMANDS]
Done
untilループとwhileループの主な違いはテスト条件です。テスト条件が真である限り、whileループは実行を続けます。反対に、テスト条件がfalseである限り、untilループは実行を続けます!
たとえば、 3x10.shを簡単に作成できます whileループの代わりにuntilループを使用したスクリプト。ここでの秘訣は、テスト条件を無効にすることです:
#!/bin/bash
num=1
until [ $num -gt 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
テスト条件の否定[$num-le10]に注意してください。は[$num-gt 10];
bashスクリプトでのループの詳細
これで、bashスクリプトのループに慣れました
このチュートリアルシリーズを最初から実行している場合は、bashの配列に精通している必要があります。
配列要素の反復処理に関しては、forループが最も一般的な選択肢であることがよくあります。
たとえば、次の prime.sh スクリプトは、プライム配列の各要素を繰り返して出力します。
#!/bin/bash
prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done
これはprime.shスクリプトの出力です:
[email protected]:~$ ./prime.sh
2
3
5
7
11
13
17
19
23
29
bashループでのBreakandContinueの使用
ループを途中で終了したり、ループの反復をスキップしたりする場合があります。これを行うには、breakステートメントとcontinueステートメントを使用できます。
breakステートメントはループの実行を終了し、プログラム制御をループに続く次のコマンドまたは命令に切り替えます。
たとえば、次のループは1から3までの数字のみを出力します。
for ((i=1;i<=10;i++)); do
echo $i
if [ $i -eq 3 ]; then
break
fi
done
続行を使用することもできます ループの反復をスキップするステートメント。ループは続行され、次の反復に移動しますが、continueステートメントの後のコマンドはその特定の反復ではスキップされます。
たとえば、次の odd.sh スクリプトはすべての偶数をスキップするため、1から10までの奇数のみを出力します:
#!/bin/bash
for ((i=0;i<=10;i++)); do
if [ $(($i % 2)) -ne 1 ]; then
continue
fi
echo $i
done
奇数を出力する出力は次のとおりです。
[email protected]:~$ ./odd.sh
1
3
5
7
9
bashの無限ループ
無限ループは、永遠に実行し続けるループです。これは、ループテスト条件が常に真である場合に発生します。
ほとんどの場合、無限ループは人間の論理エラーの産物です。
たとえば、1から10までの数字を降順で出力するループを作成したい場合、誤って次の無限ループを作成してしまう可能性があります。
for ((i=10;i>0;i++)); do
echo $i
done
問題は、ループが変数をインクリメントし続けることです i 1による 。これを修正するには、 i ++を変更する必要があります i- 次のように:
for ((i=10;i>0;i--)); do
echo $i
done
場合によっては、システムで外部条件が満たされるのを待つために、意図的に無限ループを作成したい場合があります。次のように、無限のforループを簡単に作成できます。
for ((;;)); do
[COMMANDS]
done
代わりに無限のwhileループを作成する場合は、次のように作成できます。
while [ true ]; do
[COMMANDS]
done
素晴らしい!これで、Bash初心者シリーズのこのチュートリアルは終了です。 bashでループを楽しんでいただけたでしょうか。
次に、いくつかの簡単な演習でループを練習します。以下のPDFでも解決策を入手できます。
Bash第8章練習問題この章で学んだことを練習するための問題とその解決策Bash-Chapter-8-Practice-Questions-Linux-Handbook.pdf28KB
関数を作成してbashスクリプトでコードを再利用する方法を学ぶため、次の章をご覧ください。