Как проверить, пуста ли переменная в Bash?
В bash, по крайней мере, следующие командные тесты, если $ var пуст:
if [[ -z "$var" ]]; then
#do what you want
fi
Команда man test
является вашим другом.
./test.ksh[8]: test: argument expected
не причина, но одиночная скобка не сработала, но двойная была.
Предполагая bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
: [[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
ближе к тому, что спросили. Джей включил это в свой ответ, поэтому я воздержусь от обновления своего и оставлю это как есть.
Я также видел
if [ "x$variable" = "x" ]; then ...
который, очевидно, очень надежный и независимый от оболочки.
Кроме того, существует разница между "пустым" и "неустановленным". См. Как определить, не определена ли строка в bash оболочке script?.
$variable
пуста, то строка слева от оператора сравнения становится только x
, что равно строке справа от оператора. [ x = x ]
равно "true", поэтому на практике это проверяет, является ли $variable
пустой или нет. В качестве дополнения (через 3 с половиной года после факта :-)) я бы никогда не использовал это сам, так как -z
делает то, что я, вероятно, хочу более четко, но я хотел бы добавить этот ответ, так как этот метод часто рассматривается «в дикой природе» ; возможно, так написано специально людьми, у которых был другой опыт, чем у меня.
if [ ${foo:+1} ]
then
echo "yes"
fi
выводит yes
, если переменная установлена. ${foo:+1}
вернет 1, когда переменная будет установлена, в противном случае она вернет пустую строку.
set -u
( nounset
). Почти все другие ответы на этот вопрос потерпят неудачу с unbound variable
в этом случае.
:+
нотация также полезна для ситуаций, когда у вас есть необязательные параметры командной строки, которые вы указали с помощью необязательных переменных. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
if [[ "$variable" == "" ]] ...
Это вернет 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
elif !
вместо чего- else
?
! [ -z "$MyVar" ]
будет означать, что в переменной есть что-то. Но в идеале можно было бы использовать else
.
вопрос запрашивает , как проверить, является ли переменная пустой строкой, и для нее уже даны лучшие ответы.
Но я приземлился здесь после периода, прошедшего программирование в php, и то, что я действительно искал, было проверкой, как пустая функция в php, работающая в оболочке bash.
Прочитав ответы, я понял, что в bash я не думал должным образом, но так или иначе в этот момент функция, подобная пустой в php, была бы удобной в моем коде bash.
Поскольку я думаю, что это может случиться с другими, я решил преобразовать функцию php empty в bash
Согласно руководству php:
переменная считается пустой, если она не существует или ее значение является одним из следующих:
Конечно, нулевые и ложные случаи не могут быть преобразованы в 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
Сказав, что в логике bash проверки на ноль в этой функции могут вызвать побочные проблемы imho, любой, кто использует эту функцию, должен оценить этот риск и, возможно, решит сократить эти проверки, оставив только первый.
Возможно, вы захотите провести различие между незаменимыми переменными и переменными, которые установлены и пусты:
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
Кстати, я рекомендую использовать set -u
, который вызовет ошибку при чтении неустановленных переменных, это может спасти вас от бедствий, таких как
rm -rf $dir
Вы можете прочитать об этом и других лучших практиках для "строгого режима" здесь.
Чтобы проверить, не установлена ли переменная v
if [ "$v" == "" ]; then
echo "v not set"
fi