我正在编写一个bash脚本来自动化一些sysadmin的东西。我首先检查是否定义了许多变量。我现在这样做的方式是这样的:
function is_defined {
if [ -z "$2" ]; then
echo "$1 is not defined"
exit
fi
}
is_defined "PROJECTNAME" $PROJECTNAME
我希望拥有的是一个只接受一个参数的函数:变量名称作为字符串,检查它是否已定义,如果未定义则告诉用户并退出。
在bash中执行此操作的正确替代魔法是什么?
答案 0 :(得分:2)
这样的事情:
function is_defined {
if [ -z "${!1}" ]; then
echo "$1 is not defined"
exit 1
fi
}
$ {!a}因为@sehe已经说过将打印变量值,其名称为$ 1
答案 1 :(得分:2)
可以使用奇异参数展开:${!var}
,它扩展为名称为$var
的变量。
is_defined() {
if [ -z "${!1}" ]; then
echo "$1 is not defined"
exit 1
fi
}
但我们可以进一步简化它:
bash在其鲜为人知的功能中具有${var?errormsg}
参数扩展。它基本上意味着“如果定义var
,则扩展为其值;否则,打印errormsg
,设置$?
非零并跳到下一个命令”。 errormsg
是可选的,默认为parameter null or not set
(但需要?
)。与常见的参数扩展一样,如果变量的值为空,可以使用冒号(${var:?errormsg}
)修改它也会出错。
在非交互式shell中,这种参数扩展产生的错误将中止shellcript。
is_defined() {
: ${!1:?"parameter $1 null or unset"}
}
刚才在我的MinGW bash上测试过。 :
命令只是忽略其所有输入,什么都不做,并返回成功。 (这确实会产生令人讨厌的副作用,即通过在sh: !1:
前面添加前缀来污染您的错误消息;请按照自己的意愿使用。)