Shell脚本变量替换执行报错:如何通过变量调用命令变量?
解决Shell中间接执行变量命令的问题
这个问题我碰到过,本质是shell的变量展开顺序导致的——你直接用$CMD的时候,shell只会把它当成字符串CMD_6去执行,而不会自动解析它指向的变量CMD_6的内容。下面给你几种可行的解决办法:
方法1:使用eval命令(最直接)
eval会重新解析命令行,把变量展开到最终的命令内容,刚好能解决你的需求:
CMD_6='ls' CMD_7='ls -l' VER=6 CMD="CMD_"$VER eval $CMD
执行后,eval会先把$CMD替换成CMD_6,再解析CMD_6的值为ls,最终执行ls命令列出目录内容。
方法2:使用bash间接引用语法(更安全)
bash提供了${!var}的间接引用语法,能直接获取变量值对应的变量内容,避免eval可能带来的安全风险(比如变量内容包含恶意命令时):
CMD_6='ls' CMD_7='ls -l' VER=6 CMD="CMD_"$VER ${!CMD}
这里${!CMD}的逻辑是:先取CMD的值CMD_6,再取CMD_6的变量值ls,最终执行ls。
方法3:用数组管理命令(更直观)
如果你的命令数量较多,用数组来按索引管理会更清晰,也能避免间接引用的复杂度:
# 用数组索引对应VER的数值 CMDS[6]='ls' CMDS[7]='ls -l' VER=6 ${CMDS[$VER]}
直接通过$VER作为数组索引,就能拿到对应的命令执行。
注意事项
- 如果你的命令包含特殊字符或者空格,记得给变量赋值时用双引号包裹,避免解析错误。
- 优先使用间接引用或数组的方式,
eval虽然方便但如果变量内容不可信,可能会执行危险命令。
内容的提问来源于stack exchange,提问作者user1316830
相关产品推荐
相关产品推荐

