Вопросы
Войти

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

Brent

Что является лучшим способом, чтобы определить, если переменной в bash является пустой ("")?

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

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

bash
scripting
13 Ответов
duffbeer703

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

if [ -z "$VAR" ];
Paused until further notice.

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

Любое из следующих действий:

if [[ -z $variable ]]
if [[ -z "$variable" ]]
if [[ ! $variable ]]
if [[ ! "$variable" ]]

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

if [[ $variable ]]

Этот синтаксис совместим с КШ (по крайней мере ksh93, во всяком случае). Это не работа в чистом POSIX или старше Bourne оболочек, таких как Sh или тире.

См мой ответ здесь и BashFAQ/031 дополнительные сведения о различиях между двойной и одинарные квадратные скобки.

Вы можете проверить, чтобы увидеть, если переменная конкретно не установлена (в отличие от пустой строкой):

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

где "Х" является произвольным.

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

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

Переменной в 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 is: | unset | empty | non-empty |
+-----------------------+-------+-------+-----------+
| [ -z "${VAR}" ]       | true  | true  | false     |
| [ -z "${VAR+set}" ]   | true  | false | false     |
| [ -z "${VAR-unset}" ] | false | true  | false     |
| [ -n "${VAR}" ]       | false | false | true      |
| [ -n "${VAR+set}" ]   | false | true  | true      |
| [ -n "${VAR-unset}" ] | true  | false | true      |
+-----------------------+-------+-------+-----------+

В ${VAR+foo} строительство расширяется к пустой строке, если VAR не установлен или foo если VAR установлено все (включая пустую строку).

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

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

Rory

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

Других вариантов я использовал это, чтобы установить переменную, но это можно переопределить с помощью другой переменной, например

export PORT=${MY_PORT:-5432}

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

MikeyB

Если вы заинтересованы в отличительных случаях комплект-пустой против отключенное состояние, посмотрите на опцию-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
errant.info

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

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

В любом случае, если вы снимаете неопределенные переменные (либо set -u или set -o nounset), то вы столкнетесь с проблемами при использовании обоих этих методов. Есть простой исправить это:

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

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

Luca Borrione

В вопрос просит как проверить, если переменная является пустой строкой и лучшие ответы уже даны для этого.
Но я здесь приземлился после того, как прошел период программирования в PHP и то, что я был на самом деле поиск был проверить, как пустая функция в PHP работа в оболочке bash.
Прочитав ответы я понял, что я не был должным образом мышления в bash, но, во всяком случае в тот момент функции пустые в PHP было бы очень удобно на мой bash код.
Как я думаю, это может произойти с другими, я решил превратить пустой PHP-функции в bash

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

  • "" (пустая строка)
  • 0 (0 как целое число)
  • 0.0 (0 как поплавок)
  • "0" (0 в виде строки)
  • пустой массив
  • переменная, объявленная, но без значения

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

function empty
{
    local var="$1"

    # Return true if:
    # 1.    var is a null string ("" as empty string)
    # 2.    a non set variable is passed
    # 3.    a declared variable or array but without a value is passed
    # 4.    an empty array is passed
    if test -z "$var"
    then
        [[ $( echo "1" ) ]]
        return

    # Return true if var is zero (0 as an integer or "0" as a string)
    elif [ "$var" == 0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return

    # Return true if var is 0.0 (0 as a 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

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

gluk47

Мои 5 копеек: есть еще более короткий синтаксис if ...этот один:

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

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

Другой пример может быть найден в АБС-руководство (поиск, например, 10-7).

Community

все если-то и -з излишни.

[ "$фу" ] Эхо "Foo-это не пустой"
[ "$фу" ] || Эхо "Foo-это действительно пустой"
Community

Это верно именно тогда, когда $Foo-это набор и пустая:

[ "${FOO+x}" = x ] && [ -z "$FOO" ]
Fedir RYKHTIK

Лично предпочитаю более четкий способ проверить :

if [ "${VARIABLE}" == "" ]; then
  echo VARIABLE is empty
else
  echo VARIABLE is not empty
fi
andrej

расширение, проявляющаяся в duffbeer703'ы решение:

#! /bin/bash
[ -z "$1" ] || some_command_that_needs_$1_parameter
rogerdpack

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

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

grep debian /proc/version

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

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

if $IS_DEBIAN; then
  echo 'yes debian'
else
  echo 'non debian'
fi

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