如何根据命令行输入的数组名执行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
相关产品推荐
相关产品推荐

