test コマンドの使い方|bashで条件式を評価する方法(if文・[ ]・[[ ]]比較付き)

コマンドリファレンス

test コマンドは、指定した 条件式を評価し、その結果を終了ステータスで返す コマンドです。
出力は何もせず、真なら終了ステータス 0、偽なら 1 を返します。シェルスクリプトの条件分岐(if 文など)で利用されます。

構文(Syntax)

test EXPRESSION

または、シェル構文として

[ EXPRESSION ]
[[ EXPRESSION ]]   # bash, zsh 拡張

主な条件式一覧

文字列に関する条件

条件式意味使用例
-z STRING文字列が空なら真test -z "$var"
-n STRING文字列が空でなければ真test -n "$var"
STRING1 = STRING2文字列が等しいtest "$a" = "$b"
STRING1 != STRING2文字列が異なるtest "$a" != "$b"

整数に関する条件

条件式意味使用例
INT1 -eq INT2等しいtest 5 -eq 5
INT1 -ne INT2等しくないtest 5 -ne 3
INT1 -gt INT2より大きいtest 5 -gt 3
INT1 -ge INT2以上test 5 -ge 5
INT1 -lt INT2より小さいtest 3 -lt 5
INT1 -le INT2以下test 3 -le 5

ファイルに関する条件

条件式意味使用例
-e FILEファイルが存在するtest -e file.txt
-f FILE通常ファイルなら真test -f file.txt
-d DIRディレクトリなら真test -d /tmp
-r FILE読み取り可能なら真test -r file.txt
-w FILE書き込み可能なら真test -w file.txt
-x FILE実行可能なら真test -x script.sh
FILE1 -nt FILE2FILE1 が FILE2 より新しいtest file1 -nt file2
FILE1 -ot FILE2FILE1 が FILE2 より古いtest file1 -ot file2

論理演算

条件式意味使用例
! EXPR否定test ! -f file.txt
EXPR1 -a EXPR2AND(かつ)test -f file -a -r file
EXPR1 -o EXPR2OR(または)test -f file -o -d file

実行例

文字列が空かどうか判定

test -z ""
echo $?   # 0 (真)

数値比較

test 5 -gt 3
echo $?   # 0 (真)

test 2 -eq 3
echo $?   # 1 (偽)

ファイルの存在確認

test -e /etc/passwd
echo $?   # 0 (存在する)

test -e /notfound
echo $?   # 1 (存在しない)

if 文で利用

if test -f "/etc/passwd"; then
  echo "File exists"
fi

bashのif文そのものの構文(else・elifや複数条件の書き方など)はシェルスクリプトif文の書き方|bash if else・elif・数値比較・ファイル判定を例文で解説で詳しく解説しています。

[ を使った記法

if [ -d "/tmp" ]; then
  echo "Temp dir exists"
fi

[[ を使った拡張条件(bash, zsh)

if [[ "$USER" == a* ]]; then
  echo "Username starts with 'a'"
fi

エラー例(スペース不足)

[ -f/etc/passwd ]

出力:

bash: [: missing `]'

関連コマンド

  • [ : test のシンタックスシュガー(同義コマンド)
  • [[ : bash/zsh の拡張版、パターンマッチなど強力な比較が可能
  • expr : 式の評価や計算を行う

備考

  • test はシェル組み込みコマンドとしても外部コマンドとしても存在しますが、通常は組み込み版が利用されます。
  • [ コマンドは test の別名ですが、最後に ] を必ず置く必要があります。
  • POSIX 互換性を重視するなら test または [ を、bash 専用スクリプトなら [[ ]] を使うのが一般的です。

よくある質問(FAQ)

test と [ と [[ は何が違うのですか?

test[はほぼ同じもので、POSIX準拠のどのシェルでも使えます。[[はbash/zshの拡張構文で、&&||による複合条件、==でのワイルドカードパターンマッチなどが単体で書ける代わりに、bash専用スクリプトでしか使えません。移植性を重視するならtest[、bash専用スクリプトなら[[を選びます。

test で AND / OR 条件を書くには?

testには-a(AND)・-o(OR)がありますが、POSIXでは非推奨とされており、複雑な条件では意図しない解釈をされることがあります。安全に書くならtest A && test Bのようにシェルの&&||でtestコマンド自体をつなげるか、bashなら[[ A && B ]]を使うのがおすすめです。

変数を test で比較するときに気をつけることは?

変数が空文字や未定義の場合、test $var = "abc"のようにダブルクォートを省略すると引数の数が想定と変わり、エラーになることがあります。test "$var" = "abc"のように必ずダブルクォートで囲むのが安全です。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント