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

Существует автоволшебный сервис, названный ‘servermgrd’, который слушает на tcp порте 311. Это - демон сервера для ServerAdmin и ServerMonitor, вероятно, других инструментов также. Я только что проверил клиентскую машину, и двоичный файл не существует.

Инцидентным образом порт 626 используется ‘serialnumberd’, чтобы видеть, используют ли другие Серверы OSX тот же порядковый номер в том же широковещательном домене. Инструмент ServerAdmin, вероятно, просто использует servermgrd, хотя он мог бы также использовать serialnumberd в качестве проверки.

769
задан 2 July 2015 в 01:41
14 ответов

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

if [ -z "$VAR" ];
1057
ответ дан 28 November 2019 в 19:13
  • 1
    Делает, которые включают, если переменная УСТАНОВЛЕНА на значение " "? –  Brent 12 May 2009 в 21:25
  • 2
    Да это делает... "-z" тесты для строки нулевой длины. –  David Z 13 May 2009 в 05:40

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

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

export PORT=${MY_PORT:-5432}

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

38
ответ дан 28 November 2019 в 19:13

Если Вы интересуетесь различением случаев пустых от набора по сравнению с состоянием сброса, смотрите на-u опцию для удара:

$ set -u
$ echo $BAR
bash: BAR: unbound variable
$ [ -z "$BAR" ] && echo true
bash: BAR: unbound variable
$ BAR=""
$ echo $BAR

$ [ -z "$BAR" ] && echo true
true
24
ответ дан 28 November 2019 в 19:13

все, если затем и-z являются ненужными.

[ "$foo" ] && echo "foo is not empty"
[ "$foo" ] || echo "foo is indeed empty"
5
ответ дан 28 November 2019 в 19:13
  • 1
    Это перестанет работать, если нечто будет содержать только пробелы –  Brian 21 May 2010 в 00:16

Это верно точно, когда $FOO установлен и пуст:

[ "${FOO+x}" = x ] && [ -z "$FOO" ]
4
ответ дан 28 November 2019 в 19:13

An alternate I've seen to [ -z "$foo" ] is the following, however I'm not sure why people use this method, anyone know?

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

Anyway if you're disallowing unset variables (either by set -u or set -o nounset), then you'll run into trouble with both of those methods. There's a simple fix to this:

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

Note: this will leave your variable undef.

8
ответ дан 28 November 2019 в 19:13

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

if [ "${VARIABLE}" == "" ]; then
  echo VARIABLE is empty
else
  echo VARIABLE is not empty
fi
4
ответ дан 28 November 2019 в 19:13

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

Любое из следующего:

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

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

if [[ $variable ]]

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

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

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

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

где «x» произвольно.

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

if [[ -z $variable && ${variable+x} ]]
249
ответ дан 28 November 2019 в 19:13

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

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

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

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

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

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

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

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

233
ответ дан 28 November 2019 в 19:13

одноразовое расширение решения duffbeer703 :

#! /bin/bash
[ -z "$1" ] || some_command_that_needs_$1_parameter
4
ответ дан 28 November 2019 в 19:13

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

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

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

Конечно, случаи null и false не могут быть преобразованы в 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

output:

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 проверки нуля в этой функции могут вызвать побочные проблемы imho, любой, кто использует эту функцию, должен оценить этот риск и, возможно, решить отключить эти проверки, оставив только первый.

6
ответ дан 28 November 2019 в 19:13

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

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

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

Другой пример можно найти в abs-guide (поиск «Пример 10 -7 »).

5
ответ дан 28 November 2019 в 19:13

Не точный ответ, но столкнулся с этим трюком. Если строка, которую вы ищете, происходит от «команды», вы можете сохранить команду в 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

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

0
ответ дан 28 November 2019 в 19:13

Чтобы выяснить, пуста ли переменная "Foo" и не содержит ли она пробелов (или пробелов, как некоторые ее называют).

 if [[ -n "${Foo/[ ]*\n/}" ]];then

    echo "Foo is not empty and contains non space characters"

fi


# Another way to solve the same problem: Take spaces out in Foo & check if Foo is empty

 if [[ -z "${Foo// }" ]];then

     echo "Foo is empty"

 fi
0
ответ дан 31 August 2021 в 17:52

Теги

Похожие вопросы