在bash脚本中执行命令行参数时,我似乎无法“访问”我的循环变量的值。我希望能够写出像
这样的东西#!/bin/bash
for myvar in 1 2 3
do
$@
done
并以./myscript echo "${myvar}"
运行脚本。当我这样做时,线条被回显为空。我可能没有完全掌握一个正在评估的地方。
我想要的甚至可能吗?
答案 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
。
您尝试实现的真正目标(即业务目标)是什么?可能有一种方法可以更好地与最佳实践保持一致。