次の例では、ループ処理したいテキスト (aaa
, bbb
, ccc
) を直接 for
ループで指定しています。
ここでは、do
を for
と同じ行に記述するコーディングスタイルを採用しています。
for x in aaa bbb ccc; do
echo $x
done
aaa
bbb
ccc
以下のように、スペースで区切られた文字列が格納された文字列変数を処理することもできます。
list="aaa bbb ccc"
for x in $list; do
echo $x
done
リスト内の各要素をダブルクォートで囲んでおくと、その単位でループ処理されるようになります。
#!/bin/bash
for i in "aaa bbb" "ccc ddd" "eee fff"; do
echo $i
done
aaa bbb
ccc ddd
eee fff
変数を使う場合もほぼ同様ですが、それぞれの変数をダブルクォートで囲う必要があります(これを忘れると、それぞれの変数内の文字列がスペースで区切られてループ処理されてしまいます)。
x="aaa bbb"
y="ccc ddd"
z="eee fff"
for i in "$x" "$y" "$z"; do
echo $i
done
aaa bbb
ccc ddd
eee fff
ちなみに、下記のようにすべての変数をまとめてダブルクォートで囲むと、ひとつの要素として処理されます。
for i in "$x $y $z"; do
echo $i
done
aaa bbb ccc ddd eee fff
次のように for
ループに渡す処理を {
と }
を使ってグルーピングすると、それぞれのグループ内の要素の組み合わせでループすることができます。
for x in {A,B,C}-{1,2}; do
echo $x
done
A-1
A-2
B-1
B-2
C-1
C-2
次のように括弧を重ねて使用することで、C/C++ のようなフォーマットで for ループを記述することができます。 気持ち悪いのでオススメはしませんが。。。
for (( i=0 ; i<3 ; ++i )); do
echo $i
done
0
1
2
ちなみに、上記のような連番を生成したい場合は、seq
コマンドを使うと柔軟に生成することができます。
for i in `seq 0 2`; do
echo $i
done
0
1
2
seq
コマンドでは、1ループごとのステップをマイナスにしたり、小数点数にしたりできます。
for i in `seq 1 -0.1 0.5`; do
echo $i
done
1.0
0.9
0.8
0.7
0.6
0.5