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....
Leave a Reply