Articles

The Geek Diary

シェルスクリプトには、指定された条件が発生するまで、文または文のグループを繰り返し実行したいときに何度もあります。 さらに、特定のリスト内の各要素に対して文のグループを実行することもできます。 シェルには、for、while、untilの3つのループ構造が用意されています。

forループでは、値のリストを指定することができます。 ステートメントのグループは、リスト内の各値に対して実行されます。

Forループ構文

シェル内のforループは、単語(文字列)のリストを引数として取ります。 リスト内の単語の数によって、forループ内のステートメントが実行される回数が決まります。 Forループの構文は次のとおりです。

for variable in element1 element2 element3 do commands done

ここで、

  • 変数:任意の変数名です。
  • 要素(argument_list):これは、単語、文字列、または数字の任意のリストにすることができ、それはリテラルまたはシェルコマンドまたはshell-command-lineメタ文字を使用して生成することができます。
  • コマンド: コマンドには、任意のオペレーティングシステムコマンド、ユーザープログラム、シェルスクリプト、またはリストを返す(生成する)シェル文を使用できます。

変数varの値は、ループを初めて実行するときにリストの最初の単語に設定されます。 ループを2回実行すると、その値はリスト内の2番目の単語に設定され、次のようになります。 ループは、varが引数リストの各値を順番に取得し、残りの引数がない場合に終了します。

forループの引数リスト

forループの引数リストは、単語、文字列、または数字の任意のリストにすることができます。 次のいずれかのメソッド(またはメソッドの組み合わせ)を使用して引数リストを生成します。

  • 明示的なリストを使用する
  • 変数の内容を使用する
  • コマンドライン引数を使用する
  • コマンド置換を使用する
  • コマンド置換でファイル名を使用する

例1:Forループ明示的なリストを使用して引数を指定する

forループの引数がリストされている場合、それらは明示的なリストと呼ばれます….. 明示的なリストは、引数リストの最も単純な形式です。 ループはリスト要素ごとに1回実行されます。 次の例は、要素の明示的なリストを使用するforループです。

#!/bin/bashfor 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ループ

引数が変数内にあり、ステートメントが実行されると、引数は次のようになります。変数の内容が置換されます。 次の例では、プロンプトに入力されたテキストが変数入力の値になります。 この変数は、for構文の引数リストを表します。 したがって、入力内のテキストは、空白に基づいて単語またはトークンに分割されます。

$ cat ex1.sh #!/bin/bash# Script name: ex1.shecho "Enter some text: \c" read INPUTfor var in $INPUT do echo "var contains: $var"done
$ ./ex1.shEnter some text: I like the Bash shell. var contains: Ivar contains: likevar contains: thevar contains: Kornvar contains: shell.

例3:Forループコマンドライン引数を使用して引数を指定する

次の例では、コマンドラインで入力されたテキ したがって、コマンドラインのテキストは、空白に基づいて単語またはトークンに分割されます。P>

$ cat ex2.sh#!/bin/bash# Script name: ex2.shfor var in $* do echo "command line contains: $var"done
$ ./ex2.sh I am The Geek.command line contains: Icommand line contains: amcommand line contains: Thecommand line contains: Geek.

例4 : Forループコマンド置換を使用して引数を指定する

Bashシェルでのコマンド置換の構文は次のとおりです。

for var in `cmd_sub`

次の例では、catコマンdiv>

$ cat fruit1 apple orange banana peachkiwi
$ cat ex4.sh #!/bin/bash# Script name: ex4.shfor var in `cat fruit2` do echo "var contains: $var"done
$ ./ex4.shvar contains: Apple var contains: Orange var contains: Banana var contains: Peach var contains: Kiwi

リストを含むファイルが次の形式であった場合、forループの結果は何ですか。

$ cat fruit3Apple Orange Banana Peach Kiwi
$ cat ex5.sh #!/bin/bash# Script name: ex5.shfor var in `cat fruit3` do echo "$var"done
$ ./ex5.shApple Orange Banana Peach Kiwi

上記の例では、結果は変更されません。 IFS変数は任意の空白であるため、キャリッジリターンとスペースまたはタブの両方がファイル内の各フィールドを区切っています。

例5:Forループコマンド置換でファイル名を使用して引数を指定する

いくつかのコマンドは、ファイル名とディレクトリ名を出力とし 次の例では、シェルはコマンドls/etc/p*(/etc/passwd/etc/profileなど)の出力をforループの引数リストとして置き換えます。div>

$ cat ex7.sh #!/bin/bash# Script name: ex7.shfor var in `ls /etc/p*`do print "var contains: $var"done
# ./x.sh var contains: /etc/passwdvar contains: /etc/passwd-var contains: /etc/printcapvar contains: /etc/profile....
# ./x.sh var contains: /etc/passwdvar contains: /etc/passwd-var contains: /etc/printcapvar contains: /etc/profile....