Shell test コマンド
testこのコマンドは Shell 組み込みの条件判定ツールであり、式を評価してブール値(真/偽)を返します。これは通常if文と組み合わせて使用され、Shell スクリプトで論理制御を実装する基礎です。
Shell の test コマンドは、ある条件が成立するかどうかを確認するために使用され、数値・文字・ファイルの3つの側面についてテストできます。
構文形式
test EXPRESSION # 或 [ EXPRESSION ] # 注意方括号内必须有空格
ファイルテスト操作
testこのコマンドはファイル属性の確認に最もよく使われます。以下はよく使われるファイルテストオプションです:
| 演算子 | 説明 | 例 |
|---|---|---|
| -e | ファイルが存在するか | [ -e file.txt ] |
| -f | 通常ファイルである | [ -f /path/to/file ] |
| -d | ディレクトリである | [ -d /path/to/dir ] |
| -r | 読み取り可能 | [ -r file.txt ] |
| -w | 書き込み可能 | [ -w file.txt ] |
| -x | 実行可能 | [ -x script.sh ] |
| -s | ファイルサイズが0より大きい | [ -s logfile ] |
| -L | シンボリックリンクである | [ -L symlink ] |
サンプルスクリプト:
例
#!/bin/bash
file="/etc/passwd"
if [ -e "$file" ]; then
echo "$file存在します"
if [ -r "$file" ]; then
echo "かつ読み取り可能です"
fi
else
echo "$file存在しません"
fi
file="/etc/passwd"
if [ -e "$file" ]; then
echo "$file存在します"
if [ -r "$file" ]; then
echo "かつ読み取り可能です"
fi
else
echo "$file存在しません"
fi
出力結果は次のとおりです:
/etc/passwd 存在 并且可读
文字列比較
testさまざまな文字列比較方法が用意されています:
| 演算子 | 説明 | 例 |
|---|---|---|
| -z STRING | 文字列が空である | [ -z "$var" ] |
| -n STRING | 文字列が空でない | [ -n "$var" ] |
| STRING1 = STRING2 | 文字列が等しい | [ "$var1" = "$var2" ] |
| STRING1 != STRING2 | 文字列が等しくない | [ "$var1" != "$var2" ] |
重要な注意:文字列変数は常にダブルクォートで囲む必要があります。空の変数による構文エラーを防ぎます。
例:
例
#!/bin/bash
read -p "ユーザー名を入力: " username
if [ -z "$username" ]; then
echo "エラー:ユーザー名は空にできません"
exit 1
elif [ "$username" = "root" ]; then
echo "警告:rootアカウントの使用は推奨されません"
else
echo "ようこそ、$username"
fi
read -p "ユーザー名を入力: " username
if [ -z "$username" ]; then
echo "エラー:ユーザー名は空にできません"
exit 1
elif [ "$username" = "root" ]; then
echo "警告:rootアカウントの使用は推奨されません"
else
echo "ようこそ、$username"
fi
実行後、ターミナルで サンプル と入力すると、出力結果は次のようになります:
输入用户名: サンプル 欢迎, サンプル
数値比較
数値比較には、test異なる演算子を使用します:
| 演算子 | 説明 | 例 |
|---|---|---|
| -eq | 等しい | [ "$a" -eq "$b" ] |
| -ne | 等しくない | [ "$a" -ne "$b" ] |
| -gt | より大きい | [ "$a" -gt "$b" ] |
| -ge | 以上 | [ "$a" -ge "$b" ] |
| -lt | より小さい | [ "$a" -lt "$b" ] |
| -le | 以下 | [ "$a" -le "$b" ] |
例:
例
#!/bin/bash
read -p "年齢を入力: " age
if [ "$age" -lt 0 ]; then
echo "年齢は負の数にできません"
elif [ "$age" -lt 18 ]; then
echo "未成年"
elif [ "$age" -ge 18 ] && [ "$age" -lt 60 ]; then
echo "成人"
else
echo "高齢者"
fi
read -p "年齢を入力: " age
if [ "$age" -lt 0 ]; then
echo "年齢は負の数にできません"
elif [ "$age" -lt 18 ]; then
echo "未成年"
elif [ "$age" -ge 18 ] && [ "$age" -lt 60 ]; then
echo "成人"
else
echo "高齢者"
fi
実行後、ターミナルで 12 と入力すると、出力結果は次のようになります:
输入年龄: 12 未成年人
論理演算子
test論理結合をサポートします:
| 演算子 | 説明 | 例 |
|---|---|---|
| ! | 論理否定 | [ ! -f "$file" ] |
| -a | 論理積 | [ "$a" -eq 1 -a "$b" -eq 2 ] |
| -o | 論理和 | [ "$a" -eq 1 -o "$b" -eq 2 ] |
現代の推奨記法:使用&&と||の代わりに-aと-o、POSIX 標準により適合します:
例
[ "$a" -eq 1 ] && [ "$b" -eq 2 ] # かつ
[ "$a" -eq 1 ] || [ "$b" -eq 2 ] # または
[ "$a" -eq 1 ] || [ "$b" -eq 2 ] # または
高度な使い方:[[ ]] と (( ))
Bash はより強力なテスト構文を提供します:
二重括弧 [[ ]]
- パターンマッチングをサポート:
[[ "$var" == *.txt ]] - 正規表現をサポート:
[[ "$var" =~ ^[0-9]+$ ]] - より安全な文字列処理
算術比較 (( ))
- 数値比較専用に設計されています:
(( a > b )) - より複雑な算術式をサポート
例:
例
if [[ "$file" == *.log ]]; then
echo "これはログファイルです"
fi
if (( $count > 10 )); then
echo "数量が10を超えています"
fi
echo "これはログファイルです"
fi
if (( $count > 10 )); then
echo "数量が10を超えています"
fi
実際の応用例
1. サービスが実行中かどうかを確認する
例
#!/bin/bash
service="nginx"
if systemctl is-active --quiet "$service"; then
echo "$service実行中です"
else
echo "$service実行されていません"
# サービスを起動するコマンドを追加できます
fi
service="nginx"
if systemctl is-active --quiet "$service"; then
echo "$service実行中です"
else
echo "$service実行されていません"
# サービスを起動するコマンドを追加できます
fi
2. バックアップファイルの確認
例
#!/bin/bash
backup_file="/backups/data_$(date +%Y%m%d).tar.gz"
if [ ! -f "$backup_file" ]; then
echo "エラー:バックアップファイル$backup_file""が存在しません"""
exit 1
elif [ ! -s "$backup_file" ]; then
echo "警告:バックアップファイルが空です"
else
echo "バックアップの検証に成功しました"
fi
backup_file="/backups/data_$(date +%Y%m%d).tar.gz"
if [ ! -f "$backup_file" ]; then
echo "エラー:バックアップファイル$backup_file""が存在しません"""
exit 1
elif [ ! -s "$backup_file" ]; then
echo "警告:バックアップファイルが空です"
else
echo "バックアップの検証に成功しました"
fi
よくあるエラーとデバッグのコツ
- スペースの欠落:
[ "$a"="$b" ]は誤りで、正しくは[ "$a" = "$b" ] - 引用されていない変数:
[ -f $file ]は次のようにすべき[ -f "$file" ] - 文字列比較と数値比較の混同:使用
=文字列を比較し、-eq数値を比較する
デバッグのコツ:スクリプトの先頭に追加set -xを追加してデバッグモードを有効にするか、次を使用echoテスト式を出力します:
例
echo "テスト式: [$a -eq $b ]"
[ "$a" -eq "$b" ] && echo "成立" || echo "不成立"
[ "$a" -eq "$b" ] && echo "成立" || echo "不成立"