首页 > 解决方案 > 将变量名传递给函数以测试存在和非空

问题描述

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 标准错误消息 + 退出状态:

  • 消息“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

推荐阅读