如何检查 Bash 中的变量是否为空?
10 回答
在 Bash 中,至少以下命令测试$var 是否为空:
if [[ -z "$var" ]]; then
# Do what you want
fi
命令man test
是你的朋友。
假设 Bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
我也看过
if [ "x$variable" = "x" ]; then ...
这显然是非常健壮且独立于外壳的。
此外,“空”和“未设置”之间存在差异。请参阅如何判断字符串是否未在 Bash shell 脚本中定义。
if [ ${foo:+1} ]
then
echo "yes"
fi
yes
如果设置了变量,则打印。${foo:+1}
设置变量时返回 1,否则返回空字符串。
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
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
该问题询问如何检查变量是否为空字符串,并且已经给出了最佳答案。
但是我在 PHP 中通过了一段时间的编程后才来到这里,我实际上是在寻找一个检查,比如在 Bash shell 中工作的PHP 中的空函数。
在阅读了答案后,我意识到我在 Bash 中的思考并不正确,但无论如何,在那一刻,像 PHP 中的空函数这样的函数在我的 Bash 代码中会非常方便。
由于我认为这可能发生在其他人身上,我决定在 Bash 中转换 PHP 空函数。
根据PHP 手册:
如果变量不存在或者其值为以下之一,则该变量被视为空:
- ""(一个空字符串)
- 0(0 为整数)
- 0.0(0 作为浮点数)
- "0" (0 作为字符串)
- 一个空数组
- 声明的变量,但没有值
当然bash 中不能转换null和false的情况,所以省略了。
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 逻辑中,此函数中对零的检查可能会导致附带问题,恕我直言,任何使用此函数的人都应评估此风险,并可能决定取消这些检查,只留下第一个检查。
您可能想要区分未设置的变量和已设置和为空的变量:
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
which 在读取未设置的变量时会导致错误,这可以使您免于灾难,例如
rm -rf $dir
您可以在此处阅读有关“严格模式”的此和其他最佳实践。
检查变量 v 是否未设置
if [ "$v" == "" ]; then
echo "v not set"
fi