導入
[ ] の正体は test というコマンドです。中に書く「比べ方」は種類が決まっていて、文字列用と数値用が別物なのが最大の注意点。ここを混同すると、動くけれど間違った判定になります。
説明
[ 1 -eq 1 ] と test 1 -eq 1 はまったく同じ意味です。[ はコマンド名で、] は最後の引数——だから前後にスペースが要るのでした。
比べ方の一覧です。
| 種類 | 演算子 | 意味 |
|---|---|---|
| 文字列 | = | 等しい |
| 文字列 | != | 等しくない |
| 文字列 | -z 値 | 空である |
| 文字列 | -n 値 | 空でない |
| 数値 | -eq | 等しい(equal) |
| 数値 | -ne | 等しくない(not equal) |
| 数値 | -gt -ge | より大きい/以上(greater than / equal) |
| 数値 | -lt -le | より小さい/以下(less than / equal) |
#!/bin/bash
name=太郎
count=5
if [ "$name" = "太郎" ]; then
echo "名前が一致しました"
fi
if [ "$count" -gt 3 ]; then
echo "3より大きい: $count"
fi
if [ -z "$MISSING" ]; then
echo "MISSING は空です"
fi
数値の比較に = を使ってはいけません。[ "10" = "9" ] は文字列として比べるので、10 と 9 の大小は判定できません。数値なら必ず -gt などを使います。
もう1つ大事なのが、変数は必ず " で囲むこと。$name が空のとき、囲まないと [ = 太郎 ] という壊れた式になり、エラーになります。囲めば [ "" = "太郎" ] となって、正しく「等しくない」と判定されます。
bash には
[[ ]]という強化版もあり、&&や||をそのまま書けたり、空変数に強かったりします。書けるなら[[ ]]のほうが安全ですが、#!/bin/shでは使えません。まずは[ ]を正しく書けるようになるのが先です。
やってみよう
3つの if を実行して、それぞれの判定を確かめましょう。次に count=5 を count=2 に変えて実行し、2つ目の if が通らなくなることを確認してください。さらに -gt を = に変えると、意図した比較にならないことも試してみましょう。
演習
count の値が 10 以上なら 多いです と表示する if を書いて、count=12 で実行してください。
ヒント1を見る
数値の「以上」は -ge です([ "$count" -ge 10 ])。
ヒント2を見る
count=12 にしてから if [ "$count" -ge 10 ]; then echo "多いです"; fi