Как найти, является ли переменная пустой в Bash
Как я могу проверить, пуста ли переменная в Bash?
10 ответов
в bash по крайней мере следующие командные тесты Если $var пуст:
if [[ -z "$var" ]]; then
#do what you want
fi
команда man test
- твой друг.
Я также видел
if [ "x$variable" = "x" ]; then ...
что, очевидно, очень надежно и независимо от оболочки.
кроме того, существует разница между "пустым" и "unset". См.как определить, не определена ли строка в скрипте оболочки bash?.
if [ ${foo:+1} ]
then
echo "yes"
fi
печать yes
если переменная установлена. ${foo:+1}
возвращает 1, если переменная установлена, в противном случае она вернет пустую строку.
на вопрос просит как проверить, является ли переменная пустой строкой и лучшие ответы уже даны для этого.
Но я приземлился здесь после периода программирования на php, и то, что я действительно искал, было проверкой, как пустая функция в php работа в оболочке bash.
После прочтения ответов я понял, что я не думал должным образом в bash, но в любом случае в тот момент функция, как пустой в php было бы очень удобно в моем коде bash.
Поскольку я думаю, что это может случиться с другими, я решил преобразовать пустую функцию php в bash
Согласно руководство по php:
переменная считается пустой, если она не существует или ее значение является одним из следующих:
- "" (пустая строка)
- 0 (0 как целое число)
- 0.0 (0 как поплавок)
- " 0 "(0 как a string)
- пустой массив
- объявленная переменная, но без значения
конечно null и false случаи не могут быть преобразованы в bash, поэтому они опущены.
function empty
{
local var=""
# 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
Demo:
следующий фрагмент:
#!/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, любой, кто использует эту функцию, должен оценить этот риск и, возможно, решить отключить эти проверки, оставив только первый.
вернет 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
возможно, вам захочется различать переменные unset и переменные, которые установлены и пусты:
is_empty() {
local var_name=""
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
что вызовет ошибку при чтении unset переменных, это может спасти вас от бедствий, таких как
rm -rf $dir
вы можете прочитать об этом и других лучших практик для "строгого режима" здесь.