シェル スクリプトでは、特定の条件が発生するまでステートメントまたはステートメントのグループを繰り返し実行したい場合がよくあります。さらに、特定のリスト内の各要素に対して一連のステートメントを実行したい場合があります。シェルは、これらの状況に対応するために、for、while、および until の 3 つのループ構造を提供します。
for ループを使用すると、値のリストを指定できます。リスト内の値ごとにステートメントのグループが実行されます。
ループ構文の場合
シェルの for ループは、単語 (文字列) のリストを引数として受け取ります。リスト内の単語数によって、for ループ内のステートメントが実行される回数が決まります。 for ループの構文は次のとおりです。
for variable in element1 element2 element3 do commands done
ここで:
- 変数 :任意の変数名です。
- 要素 (argument_list) :単語、文字列、または数字の任意のリストにすることができ、リテラルにすることも、シェル コマンドまたはシェル コマンド ライン メタ文字を使用して生成することもできます。
- コマンド :コマンドは、任意のオペレーティング システム コマンド、ユーザー プログラム、シェル スクリプト、またはリストを返す (生成する) シェル ステートメントにすることができます。
変数 var の値は、最初のループでリストの最初の単語に設定されます。 2 回目のループでは、その値がリストの 2 番目の単語に設定されます。 var が引数リストから各値を順番に取得し、残りの引数がなくなると、ループは終了します。
for ループの引数リスト
for ループの引数リストは、単語の任意のリストにすることができます 、文字列 、または数字 .次のいずれかの方法 (または方法の組み合わせ) を使用して、引数リストを生成します。
- 明示的なリストを使用する
- 変数の内容を使用する
- コマンドライン引数を使用する
- コマンド置換を使用
- コマンド置換でファイル名を使用する
例 1 :明示的なリストを使用して引数を指定する for ループ
for ループの引数がリストされている場合、それらは明示的なリストと呼ばれます。明示的なリストは、引数リストの最も単純な形式です。ループは、リスト要素ごとに 1 回実行されます。次の例は、要素の明示的なリストを使用した for ループです:
#!/bin/bash for fruit in apple orange banana peach kiwi do echo "Value of fruit is: $fruit" done
この for ループの出力は次のとおりです:
Value of fruit is: apple Value of fruit is: orange Value of fruit is: banana Value of fruit is: peach Value of fruit is: kiwi
例 2 :変数の内容を使用して引数を指定する for ループ
引数が変数にあり、ステートメントが実行されると、変数の内容が置き換えられます。次の例では、プロンプトで入力されたテキストが変数 INPUT の値になります。この変数は、for コンストラクトの引数リストを表します。したがって、INPUT のテキストは、空白に基づいて単語またはトークンに分割されます。
$ cat ex1.sh #!/bin/bash # Script name: ex1.sh echo "Enter some text: \c" read INPUT for var in $INPUT do echo "var contains: $var" done
$ ./ex1.sh Enter some text: I like the Bash shell. var contains: I var contains: like var contains: the var contains: Korn var contains: shell.
例 3 :コマンドライン引数を使用して引数を指定する for ループ
次の例では、コマンド ラインに入力されたテキストが for 構文の引数リストになります。したがって、コマンド ライン テキストは、空白に基づいて単語またはトークンに分割されます。
$ cat ex2.sh #!/bin/bash # Script name: ex2.sh for var in $* do echo "command line contains: $var" done
$ ./ex2.sh I am The Geek. command line contains: I command line contains: am command line contains: The command line contains: Geek.
例 4 :コマンド置換を使用して引数を指定する for ループ
Bash シェルでのコマンド置換の構文は次のとおりです:
for var in `cmd_sub`
次の例では、cat コマンドの出力を引数リストとして使用しています。
$ cat fruit1 apple orange banana peach kiwi
$ cat ex4.sh #!/bin/bash # Script name: ex4.sh for var in `cat fruit2` do echo "var contains: $var" done
$ ./ex4.sh var contains: Apple var contains: Orange var contains: Banana var contains: Peach var contains: Kiwi
リストを含むファイルが次の形式の場合、for ループの結果はどうなりますか。
$ cat fruit3 Apple Orange Banana Peach Kiwi
$ cat ex5.sh #!/bin/bash # Script name: ex5.sh for var in `cat fruit3` do echo "$var" done
$ ./ex5.sh Apple Orange Banana Peach Kiwi
上記の例では、結果は変わりません。 IFS 変数は任意の空白であるため、キャリッジ リターンとスペースまたはタブの両方でファイル内の各フィールドを区切ります。
例 5 :コマンド置換でファイル名を使用して引数を指定する for ループ
一部のコマンドは、出力としてファイル名とディレクトリ名を提供します。次の例では、シェルはコマンド ls /etc/p*(/etc/passwd/etc/profile など) の出力を for ループの引数リストとして置き換えます。
$ cat ex7.sh #!/bin/bash # Script name: ex7.sh for var in `ls /etc/p*` do print "var contains: $var" done
# ./x.sh var contains: /etc/passwd var contains: /etc/passwd- var contains: /etc/printcap var contains: /etc/profile ....Bash if ループの例 (if then fi、if then elif fi、if then else fi)