Команда test в Shell

testЭта команда — встроенный в Shell инструмент условного суждения, используемый для вычисления выражений и возврата логического значения (true/false). Обычно используется сifоператоров, и является основой для реализации логического управления в сценариях Shell.

Команда test в Shell используется для проверки истинности условия. Она может выполнять проверки в трёх областях: числовые значения, строки и файлы.

Формат синтаксиса

test EXPRESSION
# или 
[ EXPRESSION ]  # 注意方括号内必须有空格

Операции проверки файлов

testКоманда чаще всего используется для проверки атрибутов файлов. Ниже приведены распространённые параметры проверки файлов:

Operator Описание Пример
-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Предоставляет несколько методов сравнения строк:

Operator Описание Пример
-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

После выполнения мы вводим example в терминале, и вывод будет примерно таким:

输入用户名: example
欢迎, example

Числовое сравнение

Для числового сравнения,testиспользуются разные операторы:

Operator Описание Пример
-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Поддерживает логические комбинации:

Operator Описание Пример
! Логическое НЕ [ ! -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 ]]; затем
    echo "This is a log file"
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 "неверно"
Другие расширения