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

如何根据命令行输入的数组名执行Bash数组中存储的命令

解决Bash脚本动态获取数组元素并执行的问题

你的问题出在没有正确解析动态数组的元素,${array}[$i]只是简单拼接成了字符串(比如b[1]),并没有实际取出数组b索引1对应的元素值。下面提供两种可靠的解决方法:

方法1:使用Bash间接引用(推荐,更安全)

利用Bash的${!变量名}语法实现间接引用,先构造数组元素的引用字符串,再通过间接引用取值:

#!/bin/bash

array=$1
begin=$2
end=$3

# 定义数组
a[0]="cmd_a0"
a[1]="cmd_a1"
a[2]="cmd_a2"

b[0]="cmd_b0"
b[1]="cmd_b1"
b[2]="cmd_b2"
b[3]="cmd_b3"

for (( i=$begin; i<=$end; i++ ))
do
    # 构造数组元素的引用名,比如b[1]
    ref="${array}[$i]"
    # 通过间接引用获取实际值
    cmd=${!ref}
    # 输出命令
    echo "$cmd"
    # 执行命令(如果需要的话,去掉注释)
    # $cmd
done

exit 0

方法2:使用eval(需注意命令安全性)

eval可以解析并执行字符串中的变量引用,适合可控场景:

#!/bin/bash

array=$1
begin=$2
end=$3

a[0]="cmd_a0"
a[1]="cmd_a1"
a[2]="cmd_a2"

b[0]="cmd_b0"
b[1]="cmd_b1"
b[2]="cmd_b2"
b[3]="cmd_b3"

for (( i=$begin; i<=$end; i++ ))
do
    # 用eval解析数组元素
    cmd=$(eval echo "\${$array[$i]}")
    echo "$cmd"
    # 执行命令
    # eval "$cmd"
done

exit 0

执行./commands.sh b 1 3后,就能得到预期输出:

cmd_b1
cmd_b2
cmd_b3

如果需要实际执行命令,去掉对应位置的注释即可。注意如果命令包含特殊字符(比如空格、管道),建议用eval "$cmd"的方式执行,避免解析错误。

内容的提问来源于stack exchange,提问作者novi2023

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:52:49