Web

Как определить, пуста ли переменная bash?

Как лучше всего определить, пуста ли переменная в bash ("")?

Я слышал, что рекомендуется делать if [ "x$variable" = "x" ].

Это правильный способ? (должно же быть что-то более простое).

 

Ответ 1

Это вернет true, если переменная не установлена или установлена в пустую строку ("").

if [ -z "${VAR}" ];

 

Ответ 2

В Bash, когда вы не заботитесь о переносимости для оболочки, которые его не поддерживают, вы всегда должны использовать синтаксис двойных скобок:

Например: 

if  [[  -z $variable  ]]

if  [[  -z "$variable"  ]]

if  [[  ! $variable  ]]

if  [[  ! "$variable"  ]]

При использовании двойных квадратных скобок кавычки не нужны. Тест для переменной, которая содержит значение, можно упростить: 

if [[ $variable ]]

Этот синтаксис совместим с ksh (по крайней мере, с ksh93). Он не работает в чистом POSIX или старых оболочках Bourne, таких как sh или dash.

Также можно проверить, не установлена ли конкретная переменная:

if [[  -z ${variable+x} ]]

 где «х» произвольное значение.

 

Если вы хотите узнать, является ли переменная нулевой, и не отключенной:

if [[  -z $variable && ${variable+x} ]]

 

Ответ 3

Переменная в bash (и любой POSIX-совместимой оболочке) может находиться в одном из трех состояний:

  • сброшена

  • установлена в пустую строку

  • установлена в произвольную строку

 В большинстве случаев вам нужно только знать, установлена ли переменная в непустую строку, но иногда важно различать неустановленную и установленную на пустую строку.

Ниже приведены примеры того, как можно протестировать различные варианты, это работает в bash или любой POSIX-совместимой оболочке:

if [ -z "${VAR}" ]; then

    echo "VAR is unset or set to the empty string"

fi

if [ -z "${VAR+set}" ]; then

    echo "VAR is unset"

fi

if [ -z "${VAR-unset}" ]; then

    echo "VAR is set to the empty string"

fi

if [ -n "${VAR}" ]; then

    echo "VAR is set to a non-empty string"

fi

if [ -n "${VAR+set}" ]; then

    echo "VAR is set, possibly to the empty string"

fi

if [ -n "${VAR-unset}" ]; then

    echo "VAR is either unset or set to a non-empty string"

fi

Конструкция ${VAR+foo} раскрывается в пустую строку , если она не задана или в foo, если установлена ( в том числе в пустую строку).

Также ${VAR-foo}  расширяется до значения, если установлена, и в foo, если не задана. Это полезно для предоставления переопределяемых пользователем значений по умолчанию (например, ${COLOR-red} говорит использовать red, если переменная COLOR не была установлена во что-то).

Причина, по которой [ x"${VAR}" = x ] часто рекомендуется проверять, не задана ли переменная или установлена в пустую строку, заключается в том, что некоторые реализации [команды (также известной как test)  содержат ошибки. Если VAR установлена во что-то вроде -n, тогда некоторые реализации будут давать неправильные результаты, когда они заданы, [ "${VAR}" = "" ] потому что, первый аргумент [ ошибочно интерпретируется как –n оператор, а не строка.

 

Ответ 4

-z это лучший способ.

Еще один вариант, который я использовал, - это установить переменную и переопределить другой переменной, например

export PORT=${MY_PORT:-5432}

 

Если $MY_PORT переменная пуста, в PORT устанавливается значение 5432, в противном случае для PORT устанавливается значение MY_PORT. Обратите внимание, что синтаксис включает двоеточие и тире.

 

Ответ 5

Если вас интересует различие между состояниями  set-empty и unset, смотрите на параметр -u для bash:

$ set -u

$ echo $BAR

bash: BAR: unbound variable

$ [ -z "$BAR" ] && echo true

bash: BAR: unbound variable

$ BAR=""

$ echo $BAR

 

$ [ -z "$BAR" ] && echo true

true

 

Ответ 6

Альтернатива, которую я видел – это [ -z "$foo" ].Однако я не уверен, почему люди используют этот метод, кто-нибудь знает?

[ "x${foo}" = "x" ]

 

В любом случае, если вы запрещаете неустановленные переменные (с помощью set –u или  set -o nounset),  у вас возникнут проблемы с обоими этими методами. Для этого есть простое решение:

[ -z "${foo:-}" ]

 

Примечание: это оставит вашу переменную undef.

 

Ответ 7

В вопросе спрашивается, как проверить, является ли переменная пустой строкой, и для этого уже даны лучшие ответы.

Но я попал сюда после периода программирования на php, и то, что я искал, было проверкой, подобной функции empty в php, работающей в оболочке bash.

После прочтения ответов я понял, что не думал правильно о bash, но в любом случае в тот момент функция типа empty в php была бы так удобна в моем коде bash.

Поскольку я думаю, что такое может случиться и с другими, я решил преобразовать функцию php empty в bash.

Согласно руководству php: переменная считается пустой, если она не существует или если ее значение одно из следующих:

  • "" (пустая строка)

  • 0 (0 как целое число)

  • 0,0 (0 в виде числа с плавающей запятой)

  • «0» (0 в виде строки)

  • пустой массив

  • объявленна, но без значения

 Конечно, случаи null и false не могут быть преобразованы в bash, поэтому они опущены.

 function empty {

    local var="$1"

 

    # Возвращает true, если:

    # 1.    Имеет значение null ("" пустая строка)

    # 2.    Не установлена

    # 3.    Объявлена, но без значения

    # 4.    Пустой массив

    if test -z "$var"

    then

        [[ $( echo "1" ) ]]

        return

 

    # Возвращает true, если 0 (0 для integer или "0" для строки)

    elif [ "$var" == 0 2> /dev/null ]

    then

        [[ $( echo "1" ) ]]

        return

 

    # Возвращает true, если 0.0 (0 для float)

    elif [ "$var" == 0.0 2> /dev/null ]

    then

        [[ $( echo "1" ) ]]

        return

    fi

 

    [[ $( echo "" ) ]]

}

 

Пример использования:

if empty "${var}"

    then

        echo "empty"

    else

        echo "not empty"

fi

 

Демо - следующий фрагмент:

#!/bin/bash

 

vars=(

    ""

    0

    0.0

    "0"

    1

    "string"

    " "

)

 

for (( i=0; i<${#vars[@]}; i++ ))

do

    var="${vars[$i]}"

 

    if empty "${var}"

        then

            what="empty"

        else

            what="not empty"

    fi

    echo "VAR \"$var\" is $what"

done

 

exit

 

Вывод: 

VAR "" is empty

VAR "0" is empty

VAR "0.0" is empty

VAR "0" is empty

VAR "1" is not empty

VAR "string" is not empty

VAR " " is not empty

 

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

 

Ответ 8

Мои 5 центов: есть более короткий синтаксис, чем if ...:

VALUE="${1?"Usage: $0 value"}"

 

В этой строке будет установлено ЗНАЧЕНИЕ, если был предоставлен аргумент, и будет напечатано сообщение об ошибке с добавлением номера строки сценария (завершится выполнение сценария).

 

Ответ 9

Предпочитаю более понятный способ проверки:

if [ "${VARIABLE}" == "" ]; then

  echo VARIABLE is empty

else

  echo VARIABLE is not empty

fi

 

Ответ 10

Не совсем точный ответ, но я столкнулся с этим приемом. Если искомая строка приходит от "команды", то вы можете сохранить команду в переменной env. и затем выполнять ее каждый раз для оператора if, тогда скобки не нужны!

Например, эта команда, которая определяет, находитесь ли вы в debian:

grep debian /proc/version

 

Полный пример:

IS_DEBIAN="grep -i debian /proc/version"

 

if $IS_DEBIAN; then

  echo 'yes debian'

else

  echo 'non debian'

fi

 

Таким образом, это косвенный способ, который проверяет на пустую строку (проверяет ответ команды на ошибку, и может вернуть пустую строку). 

Схожие статьи

Самый быстрый DNS-сервер России: сравниваем и выбираем лучший из них
Web

Самый быстрый DNS-сервер России: сравниваем и выбираем лучший из них

Web

Создание шаблона проектирования Singleton в PHP5

Web

Ajax. Загрузка изображения

Web

Как и где устанавливается $ _SERVER ['APP_DEBUG'] в Symfony >= 5.1?