forループ

Bashスクリプトのforループについて書きます。

まずは基本から。

#!/bin/bash
for i in a b c ; do
  echo ">> $i"
done

上記では変数 i に対して in の右側にある値を一つづつ代入しループ処理をしています。結果は次のようになります。

❯ ./bin/for-loop.sh
>> a
>> b
>> c

ループさせたい値を配列として指定することもできます。例えば、同じ出力にするには次のように書きます。

#!/bin/bash
array=(a b c)
for i in ${array[@]} ; do
  echo ">> $i"
done

配列は ${array[@]} と書かなくてはいけません。 array だけだと、先頭要素のみを表現することになるからです。そうすると、次のように出力されてしまいます。

❯ ./bin/for-loop.sh
>> a

forループでファイルを処理することもできます。例えば次のようなファイルがあったとします。

This is first line.
This is second line.

次のようにすれば、ファイルをループ処理できます。

#!/bin/bash
for i in $(cat $HOME/bin/sample) ; do
  echo ">> $i"
done

結果は次のようになり、改行、またはスペース単位で処理されていることがわかります。

❯ ./bin/for-loop.sh
>> This
>> is
>> first
>> line.
>> This
>> is
>> second
>> line.

しかし、一行ずつ処理したい方がよくあるケースかもしれません。その場合はIFSを改行に設定します。

#!/bin/bash
IFS=$'\n'
for i in $(cat $HOME/bin/sample) ; do
  echo ">> $i"
done

IFSに改行を指定するには上記のように $ とシングルクォートで囲う必要がある点に注意してください。実行すると次のようになります。

❯ ./bin/for-loop.sh
>> This is first line.
>> This is second line.