for文について
for文は変数にリストで指定した値を順番に代入し、その度に「do」から「done」までの処理を実行しリストの値を全てを代入し処理が完了したら繰り返しは終了となります。
for 変数 in リスト do 処理 done
こんな書き方もできます。
for 変数 in リスト; do 処理 done
スクリプト例
変数に「i」を、リストに1~5までの数字を指定して、変数に代入された値を「echo」で表示させるという内容です。
#!/bin/bash for i in 1 2 3 4 5 do echo $i done
上記のスクリプトの実行結果は下記のようになります。
$ sh ./for1.sh 1 2 3 4 5
上のサンプルでは変数に代入されたリストの値をechoで表示させていますが、繰り返し処理の際に変数の中身を必ず使用する必要はありません。
ためしに、繰り返しの処理部分を「echo “Hello World.”」としたスクリプト作成して実行してみます。
#!/bin/bash for i in 1 2 3 4 5 do echo "Hello World." done
スクリプトを実行してみると、「echo “Hello World.”」の処理が5回実行されて「Hello World.」が5回表示されました。
$ sh ./for2.sh Hello World. Hello World. Hello World. Hello World. Hello World.
リストの指定について
リストの指定方法についていろいろとまとめてみました。
コマンドの実行結果を使用
リスト部分にはコマンドの実行結果を値として指定することも可能であり、その場合はコマンドをバッククォート(`)で囲む必要があります。
#!/bin/bash for file in `ls /var/log/messages*` do echo $file done
$ sh ./for3.sh /var/log/messages /var/log/messages-20170618 /var/log/messages-20170626 /var/log/messages-20170702 /var/log/messages-20170710
bashの場合は$()も使えます
bashであればバッククォート(`)で囲む以外にも「$()」で囲むという記述もできます。
#!/bin/bash for file in $(ls /var/log/messages*) do echo $file done
クォートが混在する場合などは、こちらの方が見た感じ分かりやすいですね。
seqコマンドを使用
seqコマンドは指定した開始の数値から終わりの数値までを表示するというコマンドなので、簡単に繰り返したい回数を指定することが出来ます。
たとえば1~5までをリストとして指定したい場合は「seq 1 5」と指定します。
$ seq 1 5 1 2 3 4 5
開始が1からの場合は開始の数値を省略することもできます。
$ seq 5 1 2 3 4 5
スクリプト例
実際に「seq」コマンドで1から5までを範囲指定して、ファイルを作成するというスクリプトになります。
#!/bin/bash for data in `seq 5` do touch file_$data done
$ sh ./for4.sh $ ls file_* file_1 file_2 file_3 file_4 file_5
seqコマンドの使用方法
「seq」コマンドの使用方法を簡単に記述しておきますので参考にしてください。
seq 終了値 | 1から始まり終了値までの数字を表示 |
seq 開始値 終了値 | 開始値から終了値までの数字を表示 |
seq 開始値 増加数 終了値 | 開始値から増加数分ずつだけ増やして終了値まで数字を表示 |
「-w」オプションを使用すると、「0」埋めすることもできます。
seq 終了値
開始値を省略すると1から指定した数値までを表示します。
$ seq 5 1 2 3 4 5
seq 開始値 終了値
開始値を指定すると1以外から数を表示させることが出来ます。
$ seq 10 15 10 11 12 13 14 15
seq 開始値 増加数 終了値
増加数を指定することでその分ずつ数値を増加させることができます。
$ seq 1 2 10 1 3 5 7 9
「-w」オプションで「0」埋め
連番のファイルを作成するときとかに便利そうですね。
$ seq -w 1 10 01 02 03 04 05 06 07 08 09 10
ブレーズ展開
bashの場合はブレーズ展開機能を使用してリストを指定することもできます。
ブレーズ展開は{開始..最後}といった形で指定することで、簡単に範囲を指定することが出来きるので便利です。
スクリプト例
例えば{1..5}で1から5を指定する場合は下記のように記述します。
#!/bin/bash for i in {1..5} do echo $i done
スクリプトを実行すると、1から5が変数「i」に代入されて「echo」コマンドにより表示されることが確認できました。
$ sh ./for5.sh 1 2 3 4 5
算術式を使用
bashの場合は下記のような記述をすることも出来ます。
for ((初期値; 繰り返し条件; 繰り返し時の処理)) do 処理 done
スクリプト例
1から5までを指定しする場合は下記のように記述します。
#!/bin/bash for ((i=1; i<6; i++)) do echo $i done
スクリプトの実行すると1から5まで繰り返されて表示されていることが確認できます。
$ sh ./for6.sh 1 2 3 4 5
ファイルから読み込む
事前にリストに読み込ませたいファイルを作成しておき、「cat」コマンド等でファイルの中身を読み込ませるという方法あります。
スクリプト例
「list.txt」というファイルを事前に作成します。
$ cat list.txt one two three four five
「cat」コマンドでファイルの中身を読み込ませます。
#!/bin/bash for i in `cat list.txt` do echo $i done
スクリプトを実行すると「list.txt」の中身が読み込まれて表示されることが確認できます。
$ sh ./for7.sh one two three four five
コマンドラインからの引数を使用
リスト部分に「”@$”」を使用すると、スクリプトを実行する際の引数をリストの値にすることができます。
スクリプト例
#!/bin/bash for i in "$@" do echo $i done
スクリプトを実行する際の引数として、「a」から「e」までを指定して実行してみます。
$ sh ./for8.sh a b c d e a b c d e
引数として指定した部分が読み込まれて表示されることが確認できます。
配列変数を使用
配列を使用してリストを指定することもできます。
スクリプト例
配列(array)に1から5を設定して、それをリスト部分で呼びだしています。
#!/bin/bash array=(1 2 3 4 5) for i in ${array[@]} do echo $i done
配列に設定した1から5が読み込まれて表示されることが確認できました。
$ sh ./for9.sh 1 2 3 4 5
コメント