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

出力結果は次のとおりです:

/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

実行後、ターミナルで サンプル と入力すると、出力結果は次のようになります:

输入用户名: サンプル
欢迎, サンプル

数値比較

数値比較には、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

実行後、ターミナルで 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 ]  # または

高度な使い方:[[ ]] と (( ))

Bash はより強力なテスト構文を提供します:

二重括弧 [[ ]]

  • パターンマッチングをサポート:[[ "$var" == *.txt ]]
  • 正規表現をサポート:[[ "$var" =~ ^[0-9]+$ ]]
  • より安全な文字列処理

算術比較 (( ))

  • 数値比較専用に設計されています:(( a > b ))
  • より複雑な算術式をサポート

例:

例

if [[ "$file" == *.log ]]; then
    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

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

よくあるエラーとデバッグのコツ

  1. スペースの欠落:[ "$a"="$b" ]は誤りで、正しくは[ "$a" = "$b" ]
  2. 引用されていない変数:[ -f $file ]は次のようにすべき[ -f "$file" ]
  3. 文字列比較と数値比較の混同:使用=文字列を比較し、-eq数値を比較する

デバッグのコツ:スクリプトの先頭に追加set -xを追加してデバッグモードを有効にするか、次を使用echoテスト式を出力します:

例

echo "テスト式: [$a -eq $b ]"
[ "$a" -eq "$b" ] && echo "成立" || echo "不成立"
その他の拡張