Linux test コマンド
testLinux/Unix システムにおける条件判定用の組み込みコマンドで、主にシェルスクリプト内でさまざまなテストや比較操作を行うために使用されます。ファイルの属性を確認したり、文字列や数値を比較したりすることができ、シェルスクリプトを作成する際に欠かせないツールです。
基本構文
test EXPRESSION # 或者使用方括号格式(更常用) [ EXPRESSION ]
注意:角括弧形式を使用する場合、式と角括弧の間にスペースが必要です。つまり、
[空格EXPRESSION空格]
主な機能分類
1. ファイルテスト
ファイルまたはディレクトリのさまざまな属性を確認します:
| 式 | 意味 |
|---|---|
-e 文件 |
ファイルが存在するか |
-f 文件 |
通常のファイルである(ディレクトリやデバイスファイルではない) |
-d 文件 |
ディレクトリである |
-s 文件 |
ファイルサイズが空でない |
-r 文件 |
ファイルが読み取り可能 |
-w 文件 |
ファイルが書き込み可能 |
-x 文件 |
ファイルが実行可能 |
-L 文件 |
ファイルがシンボリックリンクである |
例:
例
if [ -f "/etc/passwd" ]; then
echo "これは通常のファイルです"
fi
echo "これは通常のファイルです"
fi
2. 文字列比較
2つの文字列の関係を比較します:
| 式 | 意味 |
|---|---|
-z "字符串" |
文字列の長さが0 |
-n "字符串" |
文字列の長さが0でない |
"串1" = "串2" |
文字列が等しい |
"串1" != "串2" |
文字列が等しくない |
例:
例
read -p "ユーザー名を入力: " username
if [ -z "$username" ]; then
echo "ユーザー名は空にできません"
fi
if [ -z "$username" ]; then
echo "ユーザー名は空にできません"
fi
3. 数値比較
2つの整数の大小関係を比較します:
| 式 | 意味 |
|---|---|
n1 -eq n2 |
等しい (equal) |
n1 -ne n2 |
等しくない (not equal) |
n1 -gt n2 |
より大きい (greater than) |
n1 -ge n2 |
以上 |
n1 -lt n2 |
より小さい (less than) |
n1 -le n2 |
以下 |
例:
例
if [ $(id -u) -eq 0 ]; then
echo 現在はrootユーザーです
fi
echo 現在はrootユーザーです
fi
4. 論理演算子
複数のテスト条件を組み合わせます:
| 演算子 | 意味 | 例 |
|---|---|---|
! |
論理否定 (NOT) | [ ! -f file ] |
-a |
論理積 (AND) | [ -f file -a -r file ] |
-o |
論理和 (OR) | [ -d dir -o -f file ] |
現代的な推奨記法(使用する&&と||):
例
[ -f file ] && [ -r file ] # ファイルが存在し、読み取り可能
[ -d dir ] || [ -f file ] # ディレクトリまたはファイルである
[ -d dir ] || [ -f file ] # ディレクトリまたはファイルである
応用的な使い方
1. 複合条件判定
例
if [ -f "/etc/passwd" -a -r "/etc/passwd" ]; then
echo "ファイルが存在し、読み取り可能"
fi
echo "ファイルが存在し、読み取り可能"
fi
2. if 文との組み合わせ
例
if [ "$1" = "start" ]; then
echo "サービスを起動しています..."
elif [ "$1" = "stop" ]; then
echo "サービスを停止しています..."
else
echo "無効な引数"
fi
echo "サービスを起動しています..."
elif [ "$1" = "stop" ]; then
echo "サービスを停止しています..."
else
echo "無効な引数"
fi
3. 変数代入での使用
例
[ -z "$PATH" ] && PATH="/usr/bin:/bin" # PATHが空の場合はデフォルト値を設定
よくあるエラーと注意点
スペースの問題:
例
[ "$var" = "value" ] # 正しい
[ "$var"="value" ] # 間違い、スペース不足
[ "$var"="value" ] # 間違い、スペース不足
文字列変数の引用符:
例
[ -n "$var" ] # 正しい、変数が空のときのエラーを防ぐ
[ -n $var ] # $varが空のときにエラーになる
[ -n $var ] # $varが空のときにエラーになる
数値比較と文字列比較:
例
[ "10" -gt "2" ] # 正しい、数値比較
[ "10" > "2" ] # 間違い、これは文字列比較(辞書順)
[ "10" > "2" ] # 間違い、これは文字列比較(辞書順)
ファイルテストのパス:
例
[ -f "$file" ] # 正しい、変数を引用符で囲む
[ -f $file ] # パスにスペースが含まれるとエラーになる
[ -f $file ] # パスにスペースが含まれるとエラーになる
実際の応用例
例1:バックアップディレクトリが存在するか確認
例
backup_dir="/var/backups"
if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir"
echo "バックアップディレクトリを作成:$backup_dir"
fi
if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir"
echo "バックアップディレクトリを作成:$backup_dir"
fi
例2:ユーザー入力を検証
例
read -p "年齢を入力してください: " age
if [ "$age" -lt 0 -o "$age" -gt 120 ]; then
echo "無効な年齢入力"
exit 1
fi
if [ "$age" -lt 0 -o "$age" -gt 120 ]; then
echo "無効な年齢入力"
exit 1
fi
例3:サービス起動スクリプト
例
#!/bin/bash
if [ "$1" = "start" ]; then
if [ -f "/var/run/service.pid" ]; then
echo "サービスはすでに実行中です"
else
echo "サービスを起動しています..."
# 起動コマンド
fi
elif [ "$1" = "stop" ]; then
# 停止ロジック
else
echo "使用方法: $0 {start|stop}"
fi
if [ "$1" = "start" ]; then
if [ -f "/var/run/service.pid" ]; then
echo "サービスはすでに実行中です"
else
echo "サービスを起動しています..."
# 起動コマンド
fi
elif [ "$1" = "stop" ]; then
# 停止ロジック
else
echo "使用方法: $0 {start|stop}"
fi
まとめ
testこのコマンドはシェルスクリプトプログラミングにおける基本的なツールであり、これを習得すると以下のことができます:
- 条件分岐ロジックの実装
- ファイルとディレクトリの状態の検証
- 文字列と数値の比較
- 複雑な判定条件の構築
重要なポイントを覚えておきましょう:
- 角括弧形式がより一般的だが、スペースに注意
- 変数を参照するときはダブルクォートで囲む
- 文字列比較と数値比較の演算子を区別する
- 現代的な
&&と||を使用して置き換える-aと-o