如何实现Shell变量双重替换?脚本报Bad substitution错误排查
Shell脚本双重替换错误分析与解决
错误原因
你脚本里的${key${i}}是嵌套变量替换写法,POSIX标准的/bin/sh不支持这种语法,所以执行时会抛出"Bad substitution"错误。
解决方法
方案1:用eval兼容POSIX sh
如果必须保留#!/bin/sh作为解释器,可以用eval命令先解析嵌套变量,再执行输出:
#!/bin/sh key1=foo key2=bar key3=baz for i in 1 2 3; do echo $i eval echo \${key${i}} done
eval会先把${key${i}}解析为${key1}、${key2}或${key3},再执行echo输出对应值。
方案2:切换到Bash使用间接引用
将脚本开头改为#!/bin/bash,Bash支持间接引用语法${!变量名},可以直接实现需求:
#!/bin/bash key1=foo key2=bar key3=baz for i in 1 2 3; do echo $i echo ${!key$i} done
${!key$i}会先拼接出key1、key2、key3,再引用对应变量的值。
方案3:用Bash数组(更推荐)
如果可以重构变量结构,用Bash数组是更清晰、易维护的方式:
#!/bin/bash # 索引从0开始,对应原key1、key2、key3 keys=(foo bar baz) for i in 1 2 3; do echo $i # 数组索引为i-1 echo ${keys[$((i-1))]} done
或者直接遍历数组元素,更简洁:
#!/bin/bash keys=(foo bar baz) # 同时获取索引和值 for idx in "${!keys[@]}"; do echo $((idx+1)) echo ${keys[$idx]} done
内容的提问来源于stack exchange,提问作者August Karlstrom
相关产品推荐
相关产品推荐

