server-memo.net

【シェルスクリプト】(繰り返し)for文

   

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

 - シェルスクリプト