2010-06-17 3 views

ответ

323

В Баш, по крайней мере следующие испытания команда если $ вар пуст:

if [[ -z "$var" ]]; then 
    #do what you want 
fi 

Команда man test является вашим другом.

+55

двойные квадратные скобки бесполезны здесь. это может быть просто [-z "$ var"] или даже проще imho, если тест -z "var" .. anyway +1 :) –

+2

двойные квадратные скобки не бесполезны, если я не хочу, чтобы я получал './test .ksh [8]: test: аргумент ожидал 'dunnot причина, но единственная скобка не работала, но у нее была двойная. –

+5

@LucaBorrione Я думаю, вы имеете в виду 'if test -z '$ var' ', правильно? – neu242

91

Предположив Баш:

var="" 

if [ -n "$var" ]; then 
    echo "not empty" 
else 
    echo "empty" 
fi 
+9

Чем более прямым ответом является '-z':' [[-z] "$ an_unset_or_empty_var"]] && echo empty' –

+2

@glenn jackman: хороший комментарий; это правда, что '-z' ближе к тому, что было задано. Джей поставил это в своем ответе, поэтому я воздержусь от обновления моего и оставлю это как есть. – ChristopheD

8
[ "$variable" ] || echo empty 
: ${variable="value_to_set_if_unset"} 
+0

Отличный способ по умолчанию отключить var, плюс 1 – ehime

+0

@ehime, чтобы сделать значение по умолчанию, вы использовали бы '$ {variable: -default_value} ' – warvariuc

43

Я также видел

if [ "x$variable" = "x" ]; then ... 

, которая, очевидно, очень надежен и оболочки независимой.

Также существует разница между «пустым» и «неустановленным». См. How to tell if a string is not defined in a bash shell script?.

+0

Мне кажется странным. Не могли бы вы объяснить это решение. Спасибо. – guettli

+1

@guettli: Если '$ variable' пуст, то строка слева от оператора сравнения становится только« x », которая затем равна строке справа от оператора. '[x = x]' is "true", поэтому на практике это проверяет, является ли '$ variable' пустым или нет. В качестве дополнения (через 3½ года после факта :-)) я бы никогда не использовал это сам, так как '-z' делает то, что я, вероятно, хочу, более ясным, но я хотел бы добавить этот ответ, поскольку этот метод часто встречается" в дикий "; возможно, написанный таким образом нарочно, у кого был другой опыт, чем у меня. –

25
if [ ${foo:+1} ] 
then 
    echo "yes" 
fi 

печатает yes если переменная установлена. ${foo:+1} вернет 1, когда будет задана переменная, иначе она вернет пустую строку.

+2

Хотя в вопросе не упоминается, важным преимуществом этого ответа является то, что он работает даже тогда, когда переменная не определена, и активирована опция 'set -u' (' nounset'). В этом случае почти все другие ответы на этот вопрос будут терпеть неудачу с «несвязанной переменной». – anol

6

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

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

  • "" (пустая строка)
  • 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 

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

5

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

if [ -z "$MyVar" ] 
then 
    echo "The variable MyVar has nothing in it." 
elif ! [ -z "$MyVar" ] 
then 
    echo "The variable MyVar has something in it." 
fi 
+3

Зачем вам использовать 'elif!' Вместо 'else'? – ZiggyTheHamster

+0

Просто, чтобы провести различие между двумя утверждениями, то есть используя '! [-z "$ MyVar"] 'будет означать, что переменная будет иметь что-то в ней. Но в идеале можно было бы использовать 'else'. – 3kstc

1

Чтобы проверить, если переменная v не установлена ​​

if [ "$v" == "" ]; then 
    echo "v not set" 
fi 
2

Вы можете различать неустановленные переменные и переменные, которые установлены и порожних:

is_empty() { 
    local var_name="$1" 
    local var_value="${!var_name}" 
    if [[ -v "$var_name" ]]; then 
     if [[ -n "$var_value" ]]; then 
     echo "set and non-empty" 
     else 
     echo "set and empty" 
     fi 
    else 
     echo "unset" 
    fi 
} 

str="foo" 
empty="" 
is_empty str 
is_empty empty 
is_empty none 

Результат:

set and non-empty 
set and empty 
unset 

BTW, я рекомендую использовать г set -u что вызовет ошибку при чтении неустановленных переменных, это может спасти вас от бедствий, таких как

rm -rf $dir 

Вы можете прочитать об этом и других лучших практиках для «строгого режима» here.

+0

Спасибо за строгий режим! – paulcm

Смежные вопросы