0

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

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

并将脚本作为./myscript echo "${myvar}".

当我这样做时,这些行被回显为空。我可能没有一个确切的把握,确切地说是在哪里评估什么。

我想要的甚至可能吗?

4

1 回答 1

6

$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在环境中找到)。


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

于 2012-08-02T16:13:10.440 回答