在 Bash 脚本中执行命令行参数时,我似乎无法“访问”循环变量的值。我希望能够写出类似的东西
#!/bin/bash
for myvar in 1 2 3
do
$@
done
并将脚本作为./myscript echo "${myvar}"
.
当我这样做时,这些行被回显为空。我可能没有一个确切的把握,确切地说是在哪里评估什么。
我想要的甚至可能吗?
$myvar
在子脚本甚至运行之前进行评估,因此无法在其中进行评估。
也就是说,当您调用脚本时:
./myscript echo "${myvar}"
实际上被称为是:
./myscript echo ''
假设$myvar
在封闭环境中是空的。
如果你想变得邪恶(这是邪恶的,会产生错误,你不应该这样做),你可以使用 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"'
...但这基本上让你回到评估。另一方面:
./myscript ./otherscript
...会做你想做的,假设它otherscript
指的是内部的$myvar
某个地方。(这不需要是一个 shell 脚本,甚至不是一个脚本;它可以是一个可执行文件或其他命令,它仍然能够myvar
在环境中找到)。
您要达到的真正目标(即商业目的)是什么?可能有一种方法可以更好地与最佳实践保持一致。