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
相关产品推荐
相关产品推荐

