if [ -z "${VAR}" ]; then
echo "VAR is unset or set to the empty string"
fi
if [ -z "${VAR+set}" ]; then
echo "VAR is unset"
fi
if [ -z "${VAR-unset}" ]; then
echo "VAR is set to the empty string"
fi
if [ -n "${VAR}" ]; then
echo "VAR is set to a non-empty string"
fi
if [ -n "${VAR+set}" ]; then
echo "VAR is set, possibly to the empty string"
fi
if [ -n "${VAR-unset}" ]; then
echo "VAR is either unset or set to a non-empty string"
fi
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
如果变量未设置或设置为空字符串 (""),这将返回 true。
在 Bash 中,当您不关心不支持它的 shell 的可移植性时,您应该始终使用双括号语法:
以下任何一项:
在 Bash 中,使用双方括号,引号不是必需的。您可以将包含值的变量的测试简化为:
此语法与 ksh 兼容(至少 ksh93,无论如何)。它不适用于纯 POSIX 或更旧的 Bourne shell,例如 sh 或 dash。
有关双方括号和单方括号之间差异的更多信息,请参阅我的答案和BashFAQ/031 。
您可以测试以查看变量是否特别未设置(与空字符串不同):
其中“x”是任意的。
如果您想知道变量是否为 null 但未设置:
bash(以及任何与 POSIX 兼容的 shell)中的变量可以处于以下三种状态之一:
大多数时候您只需要知道变量是否设置为非空字符串,但有时区分未设置和设置为空字符串很重要。
以下是如何测试各种可能性的示例,它可以在 bash 或任何与 POSIX 兼容的 shell 中工作:
这是同样的事情,但以方便的表格形式:
如果未设置或设置为任何内容(包括空字符串) ,则该
${VAR+foo}
构造扩展为空字符串。VAR
foo
VAR
该
${VAR-foo}
构造扩展为VAR
if set(包括设置为空字符串)和foo
if unset 的值。这对于提供用户可覆盖的默认值很有用(例如,${COLOR-red}
说要使用red
,除非变量COLOR
已设置为某个值)。通常建议测试变量是否未设置或设置为空字符串的原因
[ x"${VAR}" = x ]
是因为该[
命令(也称为test
)的某些实现存在错误。如果VAR
设置为类似-n
,则某些实现在给出时会做错事,[ "${VAR}" = "" ]
因为第一个参数[
被错误地解释为-n
运算符,而不是字符串。-z
是最好的办法。我使用的另一个选项是设置一个变量,但它可以被另一个变量覆盖,例如
如果
$MY_PORT
变量为空,则PORT
设置为 5432,否则 PORT 设置为 的值MY_PORT
。注意语法包括冒号和破折号。如果您有兴趣区分 set-empty 和 unset 状态的情况,请查看 bash 的 -u 选项:
我见过的替代方法
[ -z "$foo" ]
如下,但是我不确定人们为什么使用这种方法,有人知道吗?无论如何,如果您不允许未设置的变量( by
set -u
或set -o nounset
),那么这两种方法都会遇到麻烦。有一个简单的解决方法:注意:这将保留您的变量 undef。
该问题询问如何检查变量是否为空字符串,并且已经给出了最佳答案。
但是在经过一段时间的 php 编程后,我来到了这里,而我实际上正在搜索的是一个检查,比如在 bash shell 中工作的php 中的空函数。
阅读答案后,我意识到我在 bash 中的思考不正确,但无论如何,在那一刻,像 php 中的空函数这样的函数在我的 bash 代码中会非常方便。
由于我认为这可能发生在其他人身上,我决定
根据php 手册将 bash 中的 php 空函数转换为:
如果变量不存在或者其值为以下之一,则该变量被视为空:
当然bash 中不能转换null和false的情况,所以省略了。
使用示例:
演示:
以下代码段:
输出:
话虽如此,在 bash 逻辑中,此函数中对零的检查可能会导致附带问题,恕我直言,任何使用此函数的人都应评估此风险,并可能决定取消这些检查,只留下第一个检查。
整个 if-then 和 -z 是不必要的。
个人更喜欢更清晰的检查方式:
我的 5 美分:还有一个比
if ...
, 这个更短的语法:如果提供了参数,则此行将设置 VALUE 并在出现错误时打印带有脚本行号的错误消息(并将终止脚本执行)。
另一个例子可以在abs-guide中找到(搜索 «Example 10-7»)。