シェルスクリプト

条件分岐と繰り返し

ファイルや入力を調べ、条件に応じて処理を切り替え、複数の値をまとめて処理します。

シェルスクリプト入門の講座一覧

01

ifとファイル判定

[[ ... ]]の中へ条件を書き、成功したときの処理をthenの後に置きます。ファイル判定には-e、-f、-d、-rなどを使います。

ファイルの種類を判定BASH
mkdir -p reports
path='reports'
if [[ -d "$path" ]]; then
    printf '%s はディレクトリです。\n' "$path"
elif [[ -f "$path" ]]; then
    printf '%s はファイルです。\n' "$path"
else
    printf '%s は存在しません。\n' "$path"
fi
実行結果OUTPUT
reports はディレクトリです。

条件が複雑になるときは、ひとつの条件へ詰め込みすぎず、確認内容ごとに変数や関数へ分けると読みやすくなります。

02

数値を比較する

整数を比較するときは、(( ... ))の中へ式を書けます。文字列比較の>と混同しないよう、数値には算術式を使うと意図が伝わります。

容量を判定するBASH
used=72
limit=80
if (( used >= limit )); then
    printf '上限に近づいています: %s%%\n' "$used"
else
    printf '空きがあります: %s%%\n' "$((limit - used))"
fi
実行結果OUTPUT
空きがあります: 8%

入力値を数値として扱う場合は、数字であることを確認してから計算します。空文字や文字列をそのまま計算へ渡さないようにします。

03

caseで選択肢を処理する

一つの値に対して複数の候補を調べるときはcaseが便利です。メニュー、拡張子、環境名の振り分けに向いています。

環境を選ぶBASH
environment='dev'
case "$environment" in
    dev)  printf '開発環境です。\n' ;;
    test) printf 'テスト環境です。\n' ;;
    prod) printf '本番環境です。\n' ;;
    *)    printf '不明な環境です。\n' >&2; exit 1 ;;
esac
実行結果OUTPUT
開発環境です。

*)はどの候補にも一致しなかった場合です。予想外の値を黙って本番扱いにせず、エラーにする判断も重要です。

04

forと配列で複数の値を処理する

forは、配列やファイル名の一覧を一つずつ処理するために使います。配列展開は"${items[@]}"と引用します。

拡張子を確認するBASH
files=('a.txt' 'b.log' 'c.txt')
for file in "${files[@]}"; do
    if [[ "$file" == *.txt ]]; then
        printf 'テキスト: %s\n' "$file"
    else
        printf 'その他: %s\n' "$file"
    fi
done
実行結果OUTPUT
テキスト: a.txt
その他: b.log
テキスト: c.txt
05

whileで条件が続く間処理する

whileは条件が成功している間、処理を繰り返します。カウンターを増やす、入力を一行ずつ読む、といった用途があります。

カウンターBASH
number=1
while (( number <= 3 )); do
    printf '%s回目\n' "$number"
    ((number++))
done
実行結果OUTPUT
1回目
2回目
3回目

ループ内で条件を変えないと無限ループになります。停止条件を最初に書き、必要ならテスト用に上限を設けます。

06

練習:成績を判定する

変数scoreの点数を使い、80点以上なら「優」、60点以上なら「合格」、それ未満なら「再挑戦」と表示してください。

解答例BASH
score=72
if (( score >= 80 )); then
    result='優'
elif (( score >= 60 )); then
    result='合格'
else
    result='再挑戦'
fi
printf '%s点: %s\n' "$score" "$result"
実行結果OUTPUT
72点: 合格

次はファイルとテキスト処理へ進み、条件分岐と繰り返しを実際のファイルへ適用します。