Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
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』(ディレクトリ)で確認します。
#!/bin/bash
if [ -f "/etc/hosts" ]; then
echo "/etc/hosts は通常ファイルです"
fi
if [ -d "/tmp" ]; then
echo "/tmp はディレクトリです"
fi
/etc/hosts は通常ファイルです /tmp はディレクトリです
『-r』(読み取り可能)と『-s』(サイズが0でない)を『&&』で組み合わせます。
if [ -r "/etc/hosts" ] && [ -s "/etc/hosts" ]; then
echo "読み取り可能で空でないファイルです"
fi
読み取り可能で空でないファイルです
『-z』で空文字列チェック、『-n』で非空チェックを行います。
name="Alice"
if [ -z "$name" ]; then
echo "名前が未設定です"
elif [ -n "$name" ]; then
echo "名前: $name"
fi
名前: Alice
数値の比較には『-eq』『-gt』『-lt』などの演算子を使います。
count=5
if [ $count -eq 0 ]; then
echo "ゼロ"
elif [ $count -gt 0 ] && [ $count -lt 10 ]; then
echo "1〜9の範囲"
fi
1〜9の範囲
『[[ ]]』ではワイルドカードパターンマッチ(『==』)が使えます。
filename="report_2026.pdf"
if [[ "$filename" == *.pdf ]]; then
echo "PDF ファイルです"
fi
PDF ファイルです
『[[ ]]』の『=~』演算子で正規表現にマッチするか判定します。
version="v1.2.3"
if [[ "$version" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "セマンティックバージョン形式です"
fi
セマンティックバージョン形式です
『test』コマンドの終了ステータスを『&&』で直接利用します。
test -e "/tmp" && echo "/tmp が存在します"
/tmp が存在します
概要
[ ] の内側のスペースは必須です。[ -f "$file"] のように閉じ括弧の前にスペースがないとエラーになります。また変数は必ず "$var" とダブルクォートで囲んでください。スペースを含む値が入るとコマンドの引数が増えてエラーになります。
整数比較に使う演算子(-eq -ne -lt -gt -le -ge)と文字列比較(= !=)を混同しないように注意してください。文字列に -eq を使うと予期せぬ結果になります。
if 文の使い方全体は if / elif / else を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。