Bash中获取动态展开变量名的字符串长度(Bad Substitution报错解决)
Bash脚本中获取动态命名变量的字符串长度
你遇到的Bad Substitution错误,是因为bash不支持在${#}中直接嵌套命令替换来解析动态变量名并获取长度。以下是几种可行的解决方法:
方法1:使用eval命令
通过eval先构造出正确的变量长度引用命令,再执行它:
start=1 va$start=123 # 构造并执行获取长度的命令 len=$(eval echo "\${#va$start}") for ((i=0; i < len; i++)); do # 替换为你的实际命令 echo "循环第 $i 次" done
eval会先将\${#va$start}解析为${#va1},再执行该命令得到变量va1的字符串长度。
方法2:使用间接引用(推荐,更安全)
先将动态生成的变量名存入一个临时变量,再通过bash的间接引用语法${!varname}获取目标变量的长度:
start=1 va$start=123 # 保存动态变量名 varname="va$start" # 间接引用获取长度 len=${#!varname} for ((i=0; i < len; i++)); do echo "循环第 $i 次" done
这种方法避免了eval可能带来的安全风险,可读性也更强。
方法3:使用nameref(Bash 4.3+ 支持)
如果你的bash版本在4.3及以上,可以用declare -n定义一个引用变量,直接关联到目标动态变量:
start=1 va$start=123 # 定义引用变量,指向va$start对应的变量 declare -n ref="va$start" # 直接通过引用变量获取长度 len=${#ref} for ((i=0; i < len; i++)); do echo "循环第 $i 次" done
这是最现代的写法,逻辑清晰,操作安全。
内容的提问来源于stack exchange,提问作者Don Omar
相关产品推荐
相关产品推荐

