我的bash脚本如何在命令行参数中看到循环变量?

时间:2012-08-02 16:10:12

标签: bash shell

在bash脚本中执行命令行参数时,我似乎无法“访问”我的循环变量的值。我希望能够写出像

这样的东西
#!/bin/bash
for myvar in 1 2 3
do
  $@
done

并以./myscript echo "${myvar}"运行脚本。当我这样做时,线条被回显为空。我可能没有完全掌握一个正在评估的地方。

我想要的甚至可能吗?

1 个答案:

答案 0 :(得分:6)

在子脚本运行之前评估

$myvar,因此无法对其进行评估。

也就是说,当您调用脚本时:

./myscript echo "${myvar}"

实际上被称为:

./myscript echo ''

假设封闭环境中$myvar为空。


如果你想成为邪恶的(and this is evil, and will create bugs, and you should not do it),你可以使用eval:

#!/bin/bash
for myvar in 1 2 3; do
  eval "$1"
done

...然后拨打:

./myscript 'echo "${myvar}"'

不太可怕的是导出变量:

#!/bin/bash
export myvar
for myvar in 1 2 3; do
  "$@"
done

...但即使这样,你调用脚本的方式也需要避免预先评估。例如,这将与上述结合使用:

./myscript bash -c 'echo "$myvar"'

...但这基本上让你回到了eval。另一方面:

./myscript ./otherscript

...会做你想做的事情,假设otherscript在某个地方引用$myvar。 (这不一定是shell脚本,甚至不是脚本;它可以是可执行文件或其他命令,它仍然可以在环境中找到myvar


您尝试实现的真正目标(即业务目标)是什么?可能有一种方法可以更好地与最佳实践保持一致。