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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:43:14