【发布时间】:2017-10-28 11:59:42
【问题描述】:
正如this answer 中所述,检查是否在 bash 中设置了变量的“正确”方法如下所示:
if [ -z ${var+x} ]; then
echo "var is unset"
else
echo "var is set to '$var'"
fi
我感兴趣的是如何将其提取到一个可重复用于不同变量的函数中。
到目前为止,我能做到的最好的是:
is_set() {
local test_start='[ ! -z ${'
local test_end='+x} ]'
local tester=$test_start$1$test_end
eval $tester
}
这似乎有效,但有没有更好的方法不求助于eval?
【问题讨论】:
-
创建一个函数来测试是否设置了变量似乎不是一个好主意。您将硬编码要检查的变量(这没有意义),不推荐使用
eval,尤其是当您不能绝对确定变量内容时,或者将要检查的变量值作为参数传递带您回到[[ -z $1 ]]测试开始。 -
这里有一个微妙的区别:如果
var要么 为空字符串或 未设置,[[ -z $var ]]返回 true。[[ -z ${var+x} ]]严格测试未设置。 -
@John1024: 很好!
-
@DavidC.Rankin 我想写一个函数来使代码自我记录,因为语法非常神秘。不过,考虑到复杂性,我同意你的观点,这让我思考了记录你正在编写的域逻辑和记录语言本身的工作方式之间的区别。由于语言在这里阻碍了我的努力,我将坚持使用最简单的方法,而不是尝试将其包装在函数中。
-
我不能 100% 确定你会在 bash 3 中得到相同的结果,但你可以使用
!运算符isunset() { [[ -z ${!1+x} ]];}间接检查变量,然后你可以使用if isunset var; then echo var is not set跨度>
标签: bash