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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:39:17