двойные квадратные скобки здесь бесполезны. это может быть просто [-z "$ var"] или даже проще imho, если test -z "var" .. в любом случае +1 :)
Luca Borrione
2
двойные квадратные скобки не бесполезны, если я не укажу, я не ./test.ksh[8]: test: argument expectedпонимаю причину, но одиночная скобка не сработала, но двойная была.
gahlot.jaggs
8
@ LucaBorrione Я думаю, ты имеешь в виду if test -z "$var" , верно?
neu242
1
Просто добавленный комментарий для конкретной ситуации, прямо не упомянутой в вопросе: если переменная не установлена и set -uопция активирована, этот тест не пройден unbound variable. В этом случае вы можете предпочесть решение @ alexli.
анол
3
@LucaBorrione Как примечание: «[[» можно рассматривать как «никогда не бесполезный»; использование «[[» имеет некоторые преимущества перед «[» (см., например, stackoverflow.com/questions/669452/… )
Более прямой ответ -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
Гленн Джекман
4
@glenn Jackman: хороший комментарий; это правда, что -zближе к тому, что спросили. Джей включил это в свой ответ, поэтому я воздержусь от обновления своего и оставлю это как есть.
ChristopheD
48
Я также видел
if["x$variable"="x"];then...
который, очевидно, очень прочный и независимый от оболочки.
Выглядит странно для меня. Не могли бы вы объяснить это решение. Спасибо.
Геттли
2
@guettli: Если $variableпусто, то становится только строка слева от оператора сравнения x, которая затем равна строке справа от оператора. [ x = x ]"true", поэтому на практике это проверяет, $variableявляется ли пустым или нет. В качестве дополнения (через 3 с половиной года после факта :-)) я бы никогда не использовал это сам, так как -zделает то, что я, вероятно, хочу более четко, но я хотел бы добавить этот ответ, так как этот метод часто видят «в дикой природе»; возможно, так написано специально людьми, у которых был другой опыт, чем у меня.
Даниэль Андерссон
30
if[ ${foo:+1}]then
echo "yes"fi
печатает, yesесли переменная установлена. ${foo:+1}вернет 1, когда переменная будет установлена, иначе вернет пустую строку.
Хотя этот вопрос не упоминается, важным преимуществом этого ответа является то, что он работает, даже если переменная не определена и set -uопция ( nounset) активирована. В unbound variableэтом случае почти все остальные ответы на этот вопрос потерпят неудачу .
анол
Эта :+запись также полезна для ситуаций, когда у вас есть дополнительные параметры командной строки, которые вы указали с помощью дополнительных переменных. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
Просто провести различие между двумя утверждениями, то есть использование ! [ -z "$MyVar" ]будет означать, что в переменной будет что- то внутри. Но в идеале можно было бы использовать else.
3
6
Вопрос спрашивает , как проверить , является ли переменная пустая строка и лучшие ответы уже даны для этого.
Но я попал сюда после того, как прошел период программирования на PHP, и я на самом деле искал чек, как пустую функцию в PHP работающую в оболочке Bash.
После прочтения ответов я понял , что я не думал , правильно в Bash, но так или иначе в тот момент функции , как пустые в PHP, была бы так удобна в моем коде Bash.
Поскольку я думаю, что это может случиться с другими, я решил преобразовать пустую функцию PHP в Bash.
переменная считается пустой, если она не существует или если ее значение является одним из следующих:
«» (пустая строка)
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 passedif test -z "$var"then[[ $( echo "1")]]return# Return true if var is zero (0 as an integer or "0" as a string)elif["$var"==02>/dev/null ]then[[ $( echo "1")]]return# Return true if var is 0.0 (0 as a float)elif["$var"==0.02>/dev/null ]then[[ $( echo "1")]]returnfi[[ $( echo "")]]}
Пример использования:
if empty "${var}"then
echo "empty"else
echo "not empty"fi
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, любой, кто использует эту функцию, должен оценить этот риск и, возможно, решит отключить эти проверки, оставив только первую.
Ответы:
В Bash по крайней мере следующая команда проверяет, является ли $ var пустым :
Команда
man test
твой друг.источник
./test.ksh[8]: test: argument expected
понимаю причину, но одиночная скобка не сработала, но двойная была.if test -z "$var"
, верно?set -u
опция активирована, этот тест не пройденunbound variable
. В этом случае вы можете предпочесть решение @ alexli.Предполагая Bash:
источник
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
ближе к тому, что спросили. Джей включил это в свой ответ, поэтому я воздержусь от обновления своего и оставлю это как есть.Я также видел
который, очевидно, очень прочный и независимый от оболочки.
Также есть разница между «пустым» и «неустановленным». См. Как определить, не определена ли строка в сценарии оболочки Bash .
источник
$variable
пусто, то становится только строка слева от оператора сравненияx
, которая затем равна строке справа от оператора.[ x = x ]
"true", поэтому на практике это проверяет,$variable
является ли пустым или нет. В качестве дополнения (через 3 с половиной года после факта :-)) я бы никогда не использовал это сам, так как-z
делает то, что я, вероятно, хочу более четко, но я хотел бы добавить этот ответ, так как этот метод часто видят «в дикой природе»; возможно, так написано специально людьми, у которых был другой опыт, чем у меня.печатает,
yes
если переменная установлена.${foo:+1}
вернет 1, когда переменная будет установлена, иначе вернет пустую строку.источник
set -u
опция (nounset
) активирована. Вunbound variable
этом случае почти все остальные ответы на этот вопрос потерпят неудачу .:+
запись также полезна для ситуаций, когда у вас есть дополнительные параметры командной строки, которые вы указали с помощью дополнительных переменных.myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
источник
источник
${variable:-default_value}
[ "$variable" ] || exit
Это возвратит,
true
если переменная не установлена или установлена в пустую строку ("").источник
elif !
вместоelse
?! [ -z "$MyVar" ]
будет означать, что в переменной будет что- то внутри. Но в идеале можно было бы использоватьelse
.Вопрос спрашивает , как проверить , является ли переменная пустая строка и лучшие ответы уже даны для этого.
Но я попал сюда после того, как прошел период программирования на PHP, и я на самом деле искал чек, как пустую функцию в PHP работающую в оболочке Bash.
После прочтения ответов я понял , что я не думал , правильно в Bash, но так или иначе в тот момент функции , как пустые в PHP, была бы так удобна в моем коде Bash.
Поскольку я думаю, что это может случиться с другими, я решил преобразовать пустую функцию PHP в Bash.
Согласно руководству по PHP :
переменная считается пустой, если она не существует или если ее значение является одним из следующих:
Конечно, нулевые и ложные случаи не могут быть преобразованы в bash, поэтому они опущены.
Пример использования:
Демо:
следующий фрагмент:
выходы:
Сказав, что в логике Bash проверки на ноль в этой функции могут вызвать побочные проблемы imho, любой, кто использует эту функцию, должен оценить этот риск и, возможно, решит отключить эти проверки, оставив только первую.
источник
Вы можете различать неустановленные переменные и переменные, которые установлены и пусты:
Результат:
Кстати, я рекомендую использовать,
set -u
который вызовет ошибку при чтении неустановленных переменных, это может спасти вас от таких катастроф, какВы можете прочитать об этом и других лучших практиках для "строгого режима" здесь .
источник
Проверить, не установлена ли переменная v
источник