本記事ではbashでloop処理をする方法をいくつか紹介します。
loop処理の方法
Bash には主に以下の 3 つのループ構文があります。
- forループ
- whileループ
- untilループ
ここではそれぞれのループの基本的な使い方と具体例を紹介します。
forループ
構文
for 変数 in リスト
do
コマンド ...
done
- 「リスト」には、スペース区切りの値を直接書くこともでき、{1..10} のような連番やコマンド置換なども使えます。
例 1: 単純にリストを回す
#!/bin/bash
colors=(red green blue) # 配列を定義
for color in "${colors[@]}" # 配列の全要素をループ
do
echo "color: $color"
done
実行結果
color: red
color: green
color: blue
例 2: 連番を利用する
#!/bin/bash
# {}を使った連番
for i in {1..5}
do
echo "Number: $i"
done
実行結果
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
例 3: 数値範囲を指定するfor
#!/bin/bash
for ((i=0; i<5; i++))
do
echo "i: $i"
done
- (( )) の中で C 言語のように初期化・条件・増分が書けます。
whileループ
こちらでも解説しています。
構文
while [ 条件式 ]
do
コマンド ...
done
- 条件式が真 (0) の間ループを続けます。
例 1: カウンタを使ったwhileループ
#!/bin/bash
count=1
while [ $count -le 5 ]
do
echo "count = $count"
count=$((count + 1)) # カウンタをインクリメント
done
実行結果
count = 1
count = 2
count = 3
count = 4
count = 5
例 2: ファイルを行ごとに読み込むwhileループ
#!/bin/bash
# "lines.txt" を一行ずつ読み込んで処理
while read line
do
echo "Line: $line"
done < lines.txt
- done < ファイル名 の形で、ファイルをストリームとして1行づつ読み込んで while の read に渡して処理できます。
- シェルスクリプトの内部だけでなくパイプとも組み合わせることが可能です。
cat lines.txt | while read line; do echo "Line: $line"; done
untilループ
構文
until [ 条件式 ]
do
コマンド ...
done
- whileとは逆で、条件式が偽 (0 以外) の間ループを実行し、条件式が真 (0) になるとループを抜けます。
例: untilの基本的な使い方
#!/bin/bash
count=1
until [ $count -gt 5 ]
do
echo "count = $count"
count=$((count + 1))
done
- この例では [ $count -gt 5 ] が真になる(=countが 6 以上になる)までループが継続します。
まとめ
- for: リストを順番に取得して処理したいとき、あるいは C 言語風に「初期化・条件式・カウントアップ」でループを回したいときに使う。
- while: 与えられた条件式が真(0)である限りループする。一般的にファイル読み込みやパイプ処理と組み合わせることが多い。
- until: 与えられた条件式が真になるまでループを続ける。whileの否定形のイメージで使用できる。
Bash スクリプトのループの特徴としては、
- for 変数 in リスト でループ対象を指定
- while [ 条件式 ] や until [ 条件式 ] で条件を満たすかどうか
- done < ファイル名 のように外部ファイルから入力を受ける
などの書き方があることを押さえておくと便利です。