You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell中获取名称存于变量或数组中的环境变量值及存在性校验方法

Bash 环境变量参数动态生成问题修复

需求说明

将环境变量名称存储在名为array的数组中,仅当对应环境变量已被设置时,才生成格式为-var="变量名=$变量名"的参数。例如当设置了环境变量 db_instance_type="t2.micro" 时,对应输出结果为 -var="db_instance_type=$db_instance_type"。

原始代码与问题

原始代码的变量存在性校验逻辑有误:仅使用单个$符号进行校验会导致判断结果始终为真,并未实际检测目标变量的取值是否存在。
原始代码如下:

set -u
db_instance_type="t2.micro" # for testing only
db_dns_ttl="300"    # for testing only
function check_input_vars() {
    local temp_cmd=''

    declare -a array=(db_instance_type db_vpc_id db_subnet_ids db_sg_cidr_allowed_range db_ebs_volume_size delete_on_termination_db_ebs_volume
                    security_group_id contact db_image_owner_id db_dns_ttl db_image_name_filter ws_key_name ws_dns_ttl ws_instance_type
                    ws_vpc_id  ws_subnet_ids ws_ami_id enable_ws_public_ip
                    )

    temp_cmd=''
    for var in "${array[@]}"
    do
        var_name=(${!var@})
        if [[ "${var_name}" ]]; then 
            temp_cmd+=" -var=\"$var=\$$var\""
        fi
    done   
    echo $temp_cmd
}

input_var_str="$(check_input_vars)"
echo "$input_var_str"  # output should be: -var="db_instance_type=$db_instance_type" -var="db_dns_ttl=$db_dns_ttl
unset db_instance_type  # for testing only

修复方案

注释掉set -u代码行,同时替换变量校验逻辑为以下内容:

var_value=${!var}
if [[ ! -z "${var_value}" ]]; then temp_cmd+=" -var=\"$var=\$$var\""; fi

内容的提问来源于stack exchange,提问作者Ashish Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:48:04