如何在Bash脚本中输出动态变量?附循环输入场景示例
解决Bash中动态变量input$i的引用问题
核心问题:动态变量的间接引用
你在循环中用read input${i}成功存储了输入值,但无法动态引用input$i,这是因为Bash的变量解析规则导致直接写${input$i}无法被正确识别。解决这个问题需要用到间接引用或者eval命令。
方法1:使用间接引用(推荐)
先把动态生成的变量名存到一个临时变量里,再用${!临时变量}的格式引用:
i=1 filter=case1_inputs_filter${i} echo ${filter}_field echo ${filter}_required echo ${filter}_length a=${filter}_field echo ${!a} b=${filter}_required echo ${!b} c=${filter}_length echo ${!c} while [ -n "${!a}" ] do echo -e "\nEnter ${!a} (required): " read input${i} # 正确的动态引用方式 var_name="input$i" echo "当前输入的值:${!var_name}" # 正常输出输入内容 # 循环递增,处理下一个filter i=$((i+1)) filter=case1_inputs_filter${i} a=${filter}_field done
方法2:使用eval命令
eval可以强制Bash重新解析命令,实现动态变量引用,但注意eval存在安全风险(输入含特殊字符可能执行恶意代码),仅在信任输入来源时使用:
# 在循环中替换引用部分 eval echo "当前输入的值:\$input$i"
修正YAML配置的语法错误
你的YAML配置中filter2和filter3格式有误,每个filter应是包含field、required、length的映射,正确格式如下:
case1: inputs: filter1: field: username required: true length: 5 filter2: field: date required: false length: filter3: field: time required: false length:
原格式会把filter2解析为字符串date而非映射,导致后续${filter}_field无法获取正确字段名。
内容的提问来源于stack exchange,提问作者busterSg
相关产品推荐
相关产品推荐

