bash - 将变量名传递给函数以测试存在和非空
问题描述
A)我是 bash 新手
B)我的 bash 脚本来源一个(用户可编辑的)配置脚本,我想在其中使用一个函数来测试变量的存在性和非空性。
在我的脚本中,我有 21 行(变量):
# check if constant exists
${_CONFIG_VERSION+"false"} && exitLogged "" "Constant _CONFIG_VERSION not set in ${_CONFIG_FILE}"
${_HOSTNAME+"false"} && exitLogged "" "Constant _HOSTNAME not set in ${_CONFIG_FILE}"
${_SYSTEM_NAME+"false"} && exitLogged "" "Constant _SYSTEM_NAME not set in ${_CONFIG_FILE}"
${_SP_LINK_CFG_FILENAME+"false"} && exitLogged "" "Constant _SP_LINK_CFG_FILENAME not set in ${_CONFIG_FILE}"
...
# check if constant has a value
if [[ -z "${_CONFIG_VERSION}" ]]; then exitLogged "" "Constant _CONFIG_VERSION not set in ${_CONFIG_FILE}"; fi
if [[ -z "${_HOSTNAME}" ]]; then exitLogged "" "Constant _HOSTNAME not set in ${_CONFIG_FILE}"; fi
if [[ -z "${_SYSTEM_NAME}" ]]; then exitLogged "" "Constant _SYSTEM_NAME not set in ${_CONFIG_FILE}"; fi
if [[ -z "${_SP_LINK_CFG_FILENAME}" ]]; then exitLogged "" "Constant _SP_LINK_CFG_FILENAME not set in ${_CONFIG_FILE}"; fi
...
...但想这样做:
checkIfExistAndNonEmpty _CONFIG_VERSION
checkIfExistAndNonEmpty _HOSTNAME
checkIfExistAndNonEmpty _SYSTEM_NAME
checkIfExistAndNonEmpty _SP_LINK_CFG_FILENAME
...在伪代码中具有如下功能:
function checkIfExistAndNonEmpty() {
arg1=${1}
"$"{$arg1+"false"} && exitLogged "" "Constant $arg1 not set in ${_CONFIG_FILE}"
if [[ -z "${arg1}" ]]; then ...; fi
}
exitLogged() 记录传入和退出的两个参数 ($LINENO $msg)。
这样的函数“checkIfExistAndNonEmpty()”是否可能?
目的是传递变量名;将其重建为一个变量,我可以测试它的存在性和非空性。
通常如果重复相同的事情然后推到一个函数中......但我可能会要求一些不可能的事情。
[编辑 1] 我看过这个......但并没有真正明白......
function checkIfExistAndNonEmpty() {
suffix=$1
echo "suffix:$suffix"
declare prefix_$suffix=$1
# ...and then...
varname=prefix_$suffix
echo "varname:${!varname}"
echo "---"
}
[编辑 2] 仔细想想,我可能想多了问题的解决方案?!也许一个简单的
if [[ -z "${_variable}" ]]; then echo "Variable is not specified."; fi
...会做,因为“未指定”可能意味着“它是空的”和“不存在”。
所以,除非有聪明的头脑可以启发我,否则我会按照上面的想法去做。:)
解决方案
可以将问题改写为以下内容:在代码的特定点,脚本必须检查变量列表是否已设置为非空值。
考虑选择实现这一点,而无需大量复制/粘贴:使用 bash 内置 :? 或使用自定义迭代
使用 bash:?
运算符,您将获得 bash 标准错误消息 + 退出状态:
- 消息“bash:变量:参数为空或未设置
- 退出状态 1
可以为每行指定多个测试。
: ${_CONFIG_VERSION:?}
: ${_HOSTNAME:?}
: ${_SYSTEM_NAME:?} ${_SP_LINK_CFG_FILENAME:?}
如果对控制错误消息很重要,或者有自定义错误处理
v_list=( _CONFIG_VERSION _HOSTNAME _SYSTEM_NAME ...)
for v in "${v_list[@]}" ; do
# Check if the variable expand to non-empty
if [ ! -n "${!v}" ] ; then
exitLogged "Constant $v not set in ${_CONFIG_FILE}"
fi
done
推荐阅读
- java - 解决 JDWP 错误 502
- c - 在while循环中从c中的文件读取
- node.js - 如何在 NodeJS 中更新 Firebase 身份验证的电话号码?
- java - Processbuilder运行批处理文件和pythonscript
- python - 优化音频 DSP 程序的 numpy 计算
- yaml - 带有短标题的 R Markdown (Pandoc) 投影仪演示文稿
- php - 如何打开 Laravel 项目
- r - 多个/特定列的摘要
- hyperledger-composer - aws api网关后面的作曲家休息服务器
- javascript - 使用 jQuery 实时更新 div 内容