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 はディレクトリです。条件が複雑になるときは、ひとつの条件へ詰め込みすぎず、確認内容ごとに変数や関数へ分けると読みやすくなります。
数値を比較する
整数を比較するときは、(( ... ))の中へ式を書けます。文字列比較の>と混同しないよう、数値には算術式を使うと意図が伝わります。
容量を判定するBASH
used=72
limit=80
if (( used >= limit )); then
printf '上限に近づいています: %s%%\n' "$used"
else
printf '空きがあります: %s%%\n' "$((limit - used))"
fi実行結果OUTPUT
空きがあります: 8%入力値を数値として扱う場合は、数字であることを確認してから計算します。空文字や文字列をそのまま計算へ渡さないようにします。
caseで選択肢を処理する
一つの値に対して複数の候補を調べるときはcaseが便利です。メニュー、拡張子、環境名の振り分けに向いています。
環境を選ぶBASH
environment='dev'
case "$environment" in
dev) printf '開発環境です。\n' ;;
test) printf 'テスト環境です。\n' ;;
prod) printf '本番環境です。\n' ;;
*) printf '不明な環境です。\n' >&2; exit 1 ;;
esac実行結果OUTPUT
開発環境です。*)はどの候補にも一致しなかった場合です。予想外の値を黙って本番扱いにせず、エラーにする判断も重要です。
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.txtwhileで条件が続く間処理する
whileは条件が成功している間、処理を繰り返します。カウンターを増やす、入力を一行ずつ読む、といった用途があります。
カウンターBASH
number=1
while (( number <= 3 )); do
printf '%s回目\n' "$number"
((number++))
done実行結果OUTPUT
1回目
2回目
3回目ループ内で条件を変えないと無限ループになります。停止条件を最初に書き、必要ならテスト用に上限を設けます。
練習:成績を判定する
変数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点: 合格次はファイルとテキスト処理へ進み、条件分岐と繰り返しを実際のファイルへ適用します。