GNU/Linux >> Linux の 問題 >  >> Linux

Bash初心者シリーズ#8:Bashのループ

無限ループに注意してください!

ループする機能は、bashスクリプトの非常に強力な機能です。ループにはさまざまなユースケースがあります。

このチュートリアルでは、3つの異なるbashループ構造について説明します。また、ループを使用して配列要素をトラバースする方法についても学習します。

さらに、breakステートメントとcontinueステートメントを使用してループを制御する方法を学習し、最後に、無限ループを作成する方法を学習します。

BashのForループ

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
Bashのループのリスト/範囲

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による 。

Bashでループするまで

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で印刷する

このチュートリアルシリーズを最初から実行している場合は、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スクリプトでコードを再利用する方法を学ぶため、次の章をご覧ください。


Linux
  1. Bashでループを作成する方法

  2. RHCE Ansibleシリーズ#5:Ansibleループ

  3. Bash for ループの例

  1. Bashの続行:ループを再開する方法

  2. Linuxスクリプト:Bashでのwhileループの3つのハウツー

  3. Bash初心者シリーズ#9:Bashでの関数の使用

  1. Bash while Loop

  2. Bash For Loop

  3. ループするまでBash