Команда 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 ] |
Пример сценария:
Примеры
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" ] |
Важное примечание: Строковые переменные всегда должны быть заключены в двойные кавычки, чтобы пустые переменные не вызывали синтаксические ошибки.
Пример:
Примеры
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" ] |
Пример:
Примеры
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 ] # ИЛИ
Продвинутое использование: [[ ]] и (( ))
Bash предоставляет более мощный синтаксис проверки:
Двойные квадратные скобки [[ ]]
- Поддерживает сопоставление с шаблонами:
[[ "$var" == *.txt ]] - Поддерживает регулярные выражения:
[[ "$var" =~ ^[0-9]+$ ]] - Более безопасная работа со строками
Арифметическое сравнение (( ))
- Предназначено специально для числового сравнения:
(( a > b )) - Поддерживает более сложные арифметические выражения
Пример:
Примеры
echo "This is a log file"
fi
if (( $count > 10 )); then
echo "Количество превышает 10"
fi
Примеры практического применения
1. Проверить, запущена ли служба
Примеры
service="nginx"
if systemctl is-active --quiet "$service"; then
echo "$service"запущена"
else
echo "$service"не запущена"
# Здесь можно добавить команду для запуска службы
fi
2. Проверка файла резервной копии
Примеры
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вывести проверочное выражение:
Примеры
[ "$a" -eq "$b" ] && echo "верно" || echo "неверно"