本文へスキップ
BecomeCoder

シェルスクリプトコース · 第4章 条件分岐 · レッスン16

test コマンド ― 文字列と数値を比べる

ブラウザで完結

導入

[ ] の正体は 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" ] は文字列として比べるので、109 の大小は判定できません。数値なら必ず -gt などを使います。

もう1つ大事なのが、変数は必ず " で囲むこと。$name が空のとき、囲まないと [ = 太郎 ] という壊れた式になり、エラーになります。囲めば [ "" = "太郎" ] となって、正しく「等しくない」と判定されます。

bash には [[ ]] という強化版もあり、&&|| をそのまま書けたり、空変数に強かったりします。書けるなら [[ ]] のほうが安全ですが、#!/bin/sh では使えません。まずは [ ] を正しく書けるようになるのが先です。

やってみよう

3つの if を実行して、それぞれの判定を確かめましょう。次に count=5count=2 に変えて実行し、2つ目の if が通らなくなることを確認してください。さらに -gt= に変えると、意図した比較にならないことも試してみましょう。

演習

count の値が 10 以上なら 多いです と表示する if を書いて、count=12 で実行してください。

ヒント1を見る

数値の「以上」は -ge です([ "$count" -ge 10 ])。

ヒント2を見る

count=12 にしてから if [ "$count" -ge 10 ]; then echo "多いです"; fi

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。