test
1. Синтаксис команды test
Команда test является встроенной утилитой оболочки, а также доступна как отдельный исполняемый файл /usr/bin/test. Она принимает логическое выражение и возвращает код завершения: 0 – истинно, >0 – ложно.
Основная форма:
test EXPRESSIONили эквивалентный синтаксис с квадратными скобками (появляется в большинстве скриптов):
[ 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 Файловые атрибуты
[ -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" ] |
Современные оболочки поддерживают более удобные операторы: &&, ||. Например:
[ "$a" -eq 1 ] && echo "A is one"2. Практические сценарии использования
2.1 Проверка аргументов скрипта
Один из наиболее частых случаев – проверка, передано ли требуемое количество параметров:
#!/usr/bin/env bash
if [ $# -ne 2 ]; then
echo "Usage: $0 file1 file2"
exit 1
fiЗдесь -ne гарантирует, что скрипт завершится с ошибкой при неверном вводе.
2.2 Условные копии файлов
Сценарий обновления файла только если он изменился:
if [ "$src" -nt "$dest" ]; then
cp "$src" "$dest"
fiОператор -nt (newer than) проверяет временные метки. Это экономит ресурсы и сохраняет журнал изменений.
2.3 Сборка условных команд в одном выражении
Для сложной логики можно объединить несколько условий:
if [ -d "$dir" ] && [ -r "$file" ]; then
echo "Directory exists and file is readable"
fiТакой подход повышает читаемость и уменьшает количество вложенных if.
2.4 Проверка наличия пакета
В скриптах установки полезно убедиться, что пакет уже установлен:
if ! dpkg -s "$pkg" >/dev/null 2>&1; then
apt-get install -y "$pkg"
fi
Здесь ! инвертирует результат: если команда вернула ненулевой код (не найдено), выполняется установка.
3. Советы по эффективному использованию
- Избегайте двойных кавычек вокруг чисел – они могут привести к ошибкам при сравнении. Лучше использовать
"$var"только для строк. - Проверяйте переменные на пустоту:
[ -z "$var" ]гарантирует, что переменная действительно пуста. - Не смешивайте скобки и логические операторы без группировки – используйте круглые скобки
()для явной приоритизации:
if [ $ "$a" -eq 1 -o "$b" -eq 2 $ -a "$c" -gt 0 ]; then ... fi- Для сложных условий используйте
[[ ... ]]– это расширенная версияtest, поддерживающая паттерны и регулярные выражения без необходимости экранирования скобок.
4. Частые ошибки и как их избежать
- Неверное количество аргументов в
[
Неверное количество аргументов в [
[ -e $file ] # если $file пустой, команда станет `[ -e ]` → синтаксическая ошибкаРешение: всегда оборачивайте переменные в кавычки.
2. Проблемы с путями, содержащими пробелы
if [ -f "$path/filename with space.txt" ]; then ...3. Смешивание [ и test в одном выражении – не допускается:
[ test "$a" = "b" ] # ошибкаИспользуйте либо [ ... ], либо test ....
4. Неочевидные коды возврата
Команда test возвращает 0 (истина) и 1 (ложь). Любой другой код обычно указывает на синтаксическую ошибку.
5. Полезные сочетания для админов
- Проверка прав доступа перед запуском скрипта:
if [ ! -x "$0" ]; then echo "Script not executable" exit 1 fi- Условный вызов команды при наличии файла:
[ -f /etc/ssh/sshd_config ] && systemctl reload sshd- Проверка версии ядра:
if [ "$(uname -r | cut -d. -f1)" -lt 5 ]; then echo "Kernel too old" fi