我如何在Bash中知道一个变量是否已经设置?
例如,我如何检查用户是否提供了函数的第一个参数?
function a {
# if $1 is set ?
}
我如何在Bash中知道一个变量是否已经设置?
例如,我如何检查用户是否提供了函数的第一个参数?
function a {
# if $1 is set ?
}
如果你想检查$@
中是否有任何内容,我找到了一个(更好的)代码来完成这个任务。
if [[ $1 = "" ]] then echo '$1为空' else echo '$1已填充' fi
为什么要这样做?在Bash中,$@
中的所有内容都存在,但默认情况下为空,因此test -z
和test -n
无法帮助您。
更新:您还可以计算参数中的字符数。
if [ ${#1} = 0 ] then echo '$1为空' else echo '$1已填充' fi
$array=()
以下函数测试给定名称作为变量是否存在
# The first parameter needs to be the name of the variable to be checked.
# (See example below)
var_is_declared() {
{ [[ -n ${!1+anything} ]] || declare -p $1 &>/dev/null;}
}
var_is_unset() {
{ [[ -z ${!1+anything} ]] && ! declare -p $1 &>/dev/null;}
}
$1
包含空的$array=()
的名称,则调用declare将确保我们获得正确的结果。此函数将根据以下条件进行测试:
a; # is not declared
a=; # is declared
a="foo"; # is declared
a=(); # is declared
a=(""); # is declared
unset a; # is not declared
a; # is unset
a=; # is not unset
a="foo"; # is not unset
a=(); # is not unset
a=(""); # is not unset
unset a; # is unset
.
有关测试脚本的详细信息,请参阅我对问题"如何检查bash中是否存在变量?"的答案。
备注:declare -p
的类似用法,正如 Peregring-lk 的 答案 所示,是真正的巧合。否则我当然会致谢!
set -o noun set
if printenv variableName >/dev/null; then
# variable is bound to a value
else
# variable is unbound
fi
set -o nounset
,而不是 set -o noun set
。这仅适用于已经被 export
的变量。它还以一种难以撤销的方式更改了您的设置。 - Keith Thompsonif (set -u; : $var) 2>/dev/null
。或者更简单的方式:if (: ${var?}) 2>/dev/null
。 - usretcif [[ ${1:+isset} ]]
then echo "It was set and not null." >&2
else echo "It was not set or it was null." >&2
fi
if [[ ${1+isset} ]]
then echo "It was set but might be null." >&2
else echo "It was was not set." >&2
fi
is_set
,它使用declare -p
直接测试变量是否存在。$ is_set() {
declare -p $1 >/dev/null 2>&1
}
$ is_set foo; echo $?
0
$ declare foo
$ is_set foo; echo $?
1
我总是使用这个,因为它似乎很容易被任何第一次看到代码的人理解:
if [ "$variable" = "" ]
then
echo "Variable X is empty"
fi
而且,如果想要检查是否为空;
if [ ! "$variable" = "" ]
then
echo "Variable X is not empty"
fi
就是这样。
[[ ... ]]
而不是[ ... ]
。后者实际上是一个外部命令,无法看到变量是否设置。 - solidsnack检查一个变量是否设置:
var=""; [[ $var ]] && echo "set" || echo "not set"
$var
的值为空字符串,这将失败。 - HelloGoodbyecase "$1" in
"") echo "blank";;
*) echo "set"
esac
$1
被设置为空字符串,这将失败。 - HelloGoodbye