Скрипты Shell: параметры -z и -n с оператором if

Вопрос или проблема

У меня есть скрипт оболочки, в котором есть следующие строки 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".

Применение в реальном мире

На практике, проверки переменных на пустоту (или наоборот) являются средством контроля над выполнением скрипта. Например:

  1. Проверка входных параметров: Скрипт может проверять, переданы ли правильные аргументы в функцию или нет, прежде чем продолжить выполнение.

    if [ -z "$1" ]; then
     echo "No argument supplied"
     exit 1
    fi
  2. Настройка конфигураций: Если переменная окружения не задана, скрипт может использовать значение по умолчанию или остановить выполнение с ошибкой.

    : "${CONFIG_PATH:="default/config/path"}"
  3. Обработка ошибок: Переменные состояния ошибок можно проверять с помощью -z и -n, чтобы реактивно управлять логикой скрипта после выполнения комманд.

    output=$(somecommand)
    if [ -n "$output" ]; then
     echo "Command Successful: $output"
    else
     echo "Command Failed"
    fi

Таким образом, разбираясь в том, как применять -z и -n, администраторы и разработчики могут создавать более стабильные и надежные скрипты. Эти инструменты помогают избежать ошибок, вызванных неверными или отсутствующими данными, а также позволяют адекватно управлять потоком выполнения программы.

Изучая эти и другие тестовые операторы, вы улучшаете навыки написания скриптов и получаете возможность автоматизировать задачи более эффективно и уверенно, минимизируя риски и ошибки в автоматизированных процессах управления системами.

Оцените материал
Добавить комментарий

Капча загружается...