test / [ ] / [[ ]]
『test』コマンド(または同等の『[ ]』『[[ ]]』)は条件を評価して終了ステータスで結果を返します。ファイルの存在・属性の確認、文字列・数値の比較など、if 文や while の条件式として多用します。
構文
test コマンドを使います(POSIX準拠)。
test 条件式
[ ] を使います(test の別記法)。
[ 条件式 ]
[[ ]] を使います(Bash拡張・推奨)。
[[ 条件式 ]]
条件式一覧
| 条件式 | 概要 |
|---|---|
| -e path | ファイル・ディレクトリが存在するなら真です。 |
| -f path | 通常ファイルが存在するなら真です。 |
| -d path | ディレクトリが存在するなら真です。 |
| -r path | 読み取り可能なら真です。 |
| -w path | 書き込み可能なら真です。 |
| -x path | 実行可能なら真です。 |
| -s path | ファイルサイズが0より大きいなら真です。 |
| -L path | シンボリックリンクなら真です。 |
| -z "$str" | 文字列の長さが0(空文字列)なら真です。 |
| -n "$str" | 文字列の長さが0より大きいなら真です。 |
| "$a" = "$b" | 文字列 a と b が等しいなら真です([ ] では = 、[[ ]] では == も可)。 |
| "$a" != "$b" | 文字列 a と b が異なるなら真です。 |
| $a -eq $b | 整数 a と b が等しいなら真です。 |
| $a -ne $b | 整数 a と b が異なるなら真です。 |
| $a -lt $b | a が b 未満なら真です(less than)。 |
| $a -le $b | a が b 以下なら真です(less or equal)。 |
| $a -gt $b | a が b より大きいなら真です(greater than)。 |
| $a -ge $b | a が b 以上なら真です(greater or equal)。 |
| ! 条件 | 条件を否定します。 |
| 条件1 -a 条件2 | [ ] 内の AND([[ ]] では && を使います)。 |
| 条件1 -o 条件2 | [ ] 内の OR([[ ]] では || を使います)。 |
| [[ $s =~ 正規表現 ]] | 文字列が正規表現にマッチするなら真です([[ ]] のみ)。 |
サンプルコード
ファイルの属性を『-f』(通常ファイル)、『-d』(ディレクトリ)で確認します。
check_attr.sh
#!/bin/bash
if [ -f "/etc/hosts" ]; then
echo "/etc/hosts は通常ファイルです"
fi
if [ -d "/tmp" ]; then
echo "/tmp はディレクトリです"
fi
bash check_attr.sh /etc/hosts は通常ファイルです /tmp はディレクトリです
『-r』(読み取り可能)と『-s』(サイズが0でない)を『&&』で組み合わせます。
check_readable.sh
if [ -r "/etc/hosts" ] && [ -s "/etc/hosts" ]; then
echo "読み取り可能で空でないファイルです"
fi
bash check_readable.sh 読み取り可能で空でないファイルです
『-z』で空文字列チェック、『-n』で非空チェックを行います。
check_string.sh
name="Alice"
if [ -z "$name" ]; then
echo "名前が未設定です"
elif [ -n "$name" ]; then
echo "名前: $name"
fi
bash check_string.sh 名前: Alice
数値の比較には『-eq』『-gt』『-lt』などの演算子を使います。
check_number.sh
count=5
if [ $count -eq 0 ]; then
echo "ゼロ"
elif [ $count -gt 0 ] && [ $count -lt 10 ]; then
echo "1〜9の範囲"
fi
bash check_number.sh 1〜9の範囲
『[[ ]]』ではワイルドカードパターンマッチ(『==』)が使えます。
check_pattern.sh
filename="report_2026.pdf"
if [[ "$filename" == *.pdf ]]; then
echo "PDF ファイルです"
fi
bash check_pattern.sh PDF ファイルです
『[[ ]]』の『=~』演算子で正規表現にマッチするか判定します。
check_semver.sh
version="v1.2.3"
if [[ "$version" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "セマンティックバージョン形式です"
fi
bash check_semver.sh セマンティックバージョン形式です
『test』コマンドの終了ステータスを『&&』で直接利用します。
test -e "/tmp" && echo "/tmp が存在します" /tmp が存在します
概要
[ ] の内側のスペースは必須です。『[ -f "$file"]』のように閉じ括弧の前にスペースがないとエラーになります。また変数は必ず『"$var"』とダブルクォートで囲んでください。スペースを含む値が入るとコマンドの引数が増えてエラーになります。
整数比較に使う演算子(『-eq -ne -lt -gt -le -ge』)と文字列比較(『= !=』)を混同しないように注意してください。文字列に -eq を使うと予期せぬ結果になります。
if 文の使い方全体は if / elif / else を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。