Вопрос или проблема
У меня есть скрипт оболочки, в котором есть следующие строки if [ -z "$xyz" ]
и if [ -n "$abc" ]
, но мне не ясно, какова их цель. Кто-нибудь может объяснить?
Вы можете найти очень хорошую справку по операторам встроенной команды bash [
, также известной как test
, здесь, или запустив help test
в оболочке bash или info bash test
или info bash '['
в любой оболочке¹. Если вы используете другую оболочку, просто найдите описание ее встроенной функции [
или test
в документации, а если у нее нет такой функции², то в странице man
автономной утилиты test
³, и вы найдете все, что вам нужно. В вашем конкретном случае вы используете:
-n STRING
длина STRING не равна нулю
-z STRING
длина STRING равна нулю
Для иллюстрации:
$ foo="bar";
$ [ -n "$foo" ] && echo "foo is not empty"
foo is not empty
$ [ -z "$foo" ] && echo "foo has zero length"
$ foo="";
$ [ -n "$foo" ] && echo "foo is not empty"
$ [ -z "$foo" ] && echo "foo has zero length"
foo has zero length
¹ Обратите внимание, что вам, возможно, придется установить пакеты info
и/или bash-doc
, так как некоторые системы по умолчанию предоставляют только руководства в формате man (информация также должна быть там, хотя и труднее найти).
² чтобы узнать, доступна ли команда как встроенная функция, функция, автономная внешняя утилита, вы можете использовать type
в оболочках, подобных Bourne, или fish
, which
в csh или tcsh, или whatis
в rc
и его производных.
³ Или спецификация POSIX этой стандартной утилиты, где вы найдете флаги, общие для большинства реализаций [
/test
(как встроенная функция оболочки или автономная).
Чтобы дополнить ответ тердона, я обнаружил, что Unix / Linux – Shell Basic Operators на Tutorials Point также включает операторы, связанные с файлами (а также другие полезные).
-b file Проверяет, является ли файл блоковым специальным файлом; если да, то условие становится истинным. [ -b $file ] ложно.
-c file Проверяет, является ли файл символьным специальным файлом; если да, то условие становится истинным. [ -c $file ] ложно.
-d file Проверяет, является ли файл каталогом; если да, то условие становится истинным. [ -d $file ] неистинно.
-f file Проверяет, является ли файл обычным файлом, а не каталогом или специальным файлом; если да, то условие становится истинным. [ -f $file ] истинно.
-g file Проверяет, установлен ли у файла бит set group ID (SGID); если да, то условие становится истинным. [ -g $file ] ложно.
-k file Проверяет, установлен ли у файла бит принятия; если да, то условие становится истинным. [ -k $file ] ложно.
-p file Проверяет, является ли файл именованным каналом; если да, то условие становится истинным. [ -p $file ] ложно.
-t file Проверяет, открыт ли файловый дескриптор и связан ли он с терминалом; если да, то условие становится истинным. [ -t $file ] ложно.
-u file Проверяет, установлен ли у файла бит Set User ID (SUID); если да, то условие становится истинным. [ -u $file ] ложно.
-r file Проверяет, можно ли прочитать файл; если да, то условие становится истинным. [ -r $file ] истинно.
-w file Проверяет, можно ли записать файл; если да, то условие становится истинным. [ -w $file ] истинно.
-x file Проверяет, можно ли выполнить файл; если да, то условие становится истинным. [ -x $file ] истинно.
-s file Проверяет, имеет ли файл размер больше 0; если да, то условие становится истинным. [ -s $file ] истинно.
-e file Проверяет, существует ли файл; это истинно, даже если файл является каталогом, но существует. [ -e $file ] истинно.
man test
или man [
дадут вам все опции команды test. В данном случае, -n проверяет, имеет ли содержимое $abc ненулевую длину, а -z проверяет, является ли содержимое $xyz строкой нулевой длины.
Ответ или решение
В shell-скриптинге, особенно когда речь идет о bash или других Bourne-like оболочек, такие опции как -z
и -n
являются своеобразными основными инструментами для управления логикой скрипта на основе строковых переменных. Эти опции применяются в контексте проверок условий с помощью команды или встроенной функции test
, которая также может быть использована в форме квадратных скобок []
. Позвольте мне объяснить их конкретную цель и применение с примерами, а затем перейду к практике их удобного использования в реальном мире scripting.
Теория: назначение опций -z
и -n
Опция -z
:
- Описание:
-z STRING
проверяет, является ли длина строки STRING нулевой. Это означает, что данная опция вернет истину (true), если переменная пуста или вообще не задана. - Пример: если переменная
xyz
не содержит значений (или равна пустой строке), выражение[ -z "$xyz" ]
вернёт истину, позволяя выполнять любой код, заключенный в условный операторif
.
Опция -n
:
- Описание:
-n STRING
проверяет, что длина строки STRING больше нуля. Опция возвращает истину, когда строка непустая. - Пример: для переменной
abc
, которая содержит какие-либо данные, проверка[ -n "$abc" ]
вернёт истину и триггернет выполнение связанного кода в условном блокеif
.
Примеры использования
Рассмотрим следующие примеры в контексте shell-скрипта для лучшего понимания:
#!/bin/bash
xyz=""
abc="Hello, World!"
if [ -z "$xyz" ]; then
echo "xyz is empty"
else
echo "xyz is not empty"
fi
if [ -n "$abc" ]; then
echo "abc is not empty"
else
echo "abc is empty"
fi
Вывод:
- Первая проверка с
-z
подтвердит, чтоxyz
пустая и напечатает "xyz is empty". - Вторая проверка с
-n
подтвердит, чтоabc
непустая и выведет "abc is not empty".
Применение в реальном мире
На практике, проверки переменных на пустоту (или наоборот) являются средством контроля над выполнением скрипта. Например:
-
Проверка входных параметров: Скрипт может проверять, переданы ли правильные аргументы в функцию или нет, прежде чем продолжить выполнение.
if [ -z "$1" ]; then echo "No argument supplied" exit 1 fi
-
Настройка конфигураций: Если переменная окружения не задана, скрипт может использовать значение по умолчанию или остановить выполнение с ошибкой.
: "${CONFIG_PATH:="default/config/path"}"
-
Обработка ошибок: Переменные состояния ошибок можно проверять с помощью
-z
и-n
, чтобы реактивно управлять логикой скрипта после выполнения комманд.output=$(somecommand) if [ -n "$output" ]; then echo "Command Successful: $output" else echo "Command Failed" fi
Таким образом, разбираясь в том, как применять -z
и -n
, администраторы и разработчики могут создавать более стабильные и надежные скрипты. Эти инструменты помогают избежать ошибок, вызванных неверными или отсутствующими данными, а также позволяют адекватно управлять потоком выполнения программы.
Изучая эти и другие тестовые операторы, вы улучшаете навыки написания скриптов и получаете возможность автоматизировать задачи более эффективно и уверенно, минимизируя риски и ошибки в автоматизированных процессах управления системами.