test

1. Синтаксис команды test

Команда test является встроенной утилитой оболочки, а также доступна как отдельный исполняемый файл /usr/bin/test. Она принимает логическое выражение и возвращает код завершения: 0 – истинно, >0 – ложно.
Основная форма:

Bash
test EXPRESSION

или эквивалентный синтаксис с квадратными скобками (появляется в большинстве скриптов):

Bash
[ EXPRESSION ]

1.1 Операторы сравнения

ОператорДействиеПример
-eqравно числу[ "$a" -eq 10 ]
-neне равно[ "$b" -ne 5 ]
-gtбольше[ "$c" -gt 20 ]
-ltменьше[ "$d" -lt 7 ]
-ge[ "$e" -ge 3 ]
-le[ "$f" -le 12 ]

1.2 Строковые операторы

ОператорДействиеПример
=строки равны[ "$s1" = "$s2" ]
!=неравны[ "$s3" != "test" ]

1.3 Файловые атрибуты

Bash
[ -e FILE ]   # существует
[ -f FILE ]   # обычный файл
[ -d FILE ]   # каталог
[ -r FILE ]   # читаемый
[ -w FILE ]   # записываемый
[ -x FILE ]   # исполняемый

1.4 Логические операторы

ОператорДействиеПример
-aИ (AND)[ "$x" -gt 0 -a "$y" -lt 10 ]
-oИли (OR)[ "$z" = "yes" -o "$w" = "no" ]

Современные оболочки поддерживают более удобные операторы: &&, ||. Например:

Bash
[ "$a" -eq 1 ] && echo "A is one"

2. Практические сценарии использования

2.1 Проверка аргументов скрипта

Один из наиболее частых случаев – проверка, передано ли требуемое количество параметров:

Bash
#!/usr/bin/env bash
if [ $# -ne 2 ]; then
    echo "Usage: $0 file1 file2"
    exit 1
fi

Здесь -ne гарантирует, что скрипт завершится с ошибкой при неверном вводе.

2.2 Условные копии файлов

Сценарий обновления файла только если он изменился:

Bash
if [ "$src" -nt "$dest" ]; then
    cp "$src" "$dest"
fi

Оператор -nt (newer than) проверяет временные метки. Это экономит ресурсы и сохраняет журнал изменений.

2.3 Сборка условных команд в одном выражении

Для сложной логики можно объединить несколько условий:

Bash
if [ -d "$dir" ] && [ -r "$file" ]; then
    echo "Directory exists and file is readable"
fi

Такой подход повышает читаемость и уменьшает количество вложенных if.

2.4 Проверка наличия пакета

В скриптах установки полезно убедиться, что пакет уже установлен:

Bash
if ! dpkg -s "$pkg" >/dev/null 2>&1; then
    apt-get install -y "$pkg"
fi

Здесь ! инвертирует результат: если команда вернула ненулевой код (не найдено), выполняется установка.


3. Советы по эффективному использованию

  • Избегайте двойных кавычек вокруг чисел – они могут привести к ошибкам при сравнении. Лучше использовать "$var" только для строк.
  • Проверяйте переменные на пустоту[ -z "$var" ] гарантирует, что переменная действительно пуста.
  • Не смешивайте скобки и логические операторы без группировки – используйте круглые скобки ( ) для явной приоритизации:
Bash
if [ $ "$a" -eq 1 -o "$b" -eq 2 $ -a "$c" -gt 0 ]; then ... fi
  • Для сложных условий используйте [[ ... ]] – это расширенная версия test, поддерживающая паттерны и регулярные выражения без необходимости экранирования скобок.

4. Частые ошибки и как их избежать

  1. Неверное количество аргументов в [
Bash
Неверное количество аргументов в [

[ -e $file ]          # если $file пустой, команда станет `[ -e ]` → синтаксическая ошибка

Решение: всегда оборачивайте переменные в кавычки.

2. Проблемы с путями, содержащими пробелы

Bash
if [ -f "$path/filename with space.txt" ]; then ...

3. Смешивание [ и test в одном выражении – не допускается:

Bash
[ test "$a" = "b" ] # ошибка

Используйте либо [ ... ], либо test ....

4. Неочевидные коды возврата
Команда test возвращает 0 (истина) и 1 (ложь). Любой другой код обычно указывает на синтаксическую ошибку.


    5. Полезные сочетания для админов

    • Проверка прав доступа перед запуском скрипта:
    Bash
    if [ ! -x "$0" ]; then echo "Script not executable" exit 1 fi
    • Условный вызов команды при наличии файла:
    Bash
    [ -f /etc/ssh/sshd_config ] && systemctl reload sshd
    • Проверка версии ядра:
    Bash
    if [ "$(uname -r | cut -d. -f1)" -lt 5 ]; then echo "Kernel too old" fi