2012-08-02 41 views
0

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

#!/bin/bash 
for myvar in 1 2 3 
do 
    [email protected] 
done 

并运行脚本为./myscript echo "${myvar}"。当我这样做时,这些线条被回显为空。我可能没有一个确切的把握什么是评估哪里。

是我想甚至可能吗?

+0

您可以使用'bash -x myscript'来查看'myvar'是如何设置的(以及关于脚本执行的许多其他细节)。 – chepner 2012-08-02 16:22:11

回答

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 
    "[email protected]" 
done 

...但即使如此,您调用脚本的方式也需要避免预设。例如,这将与上述结合使用:

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

...但基本上你已经回到评估。在另一方面:

./myscript ./otherscript 

...会做你想要什么,假设说otherscript$myvar某处内。 (这不一定是shell脚本,甚至不是脚本;它可以是可执行文件或其他命令,它仍然能够在环境中找到myvar)。


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

+2

+1问有关问题“真正的目标是什么”。 – chepner 2012-08-02 16:23:26

+1

也许你可以在1 2 3中使用类似'for myvar的东西;做“$ @”“$ myvar”;完成' – tripleee 2012-08-02 18:20:59

+0

我开始尝试推出我自己的解决方案[在多个远程计算机上运行命令](http://serverfault.com/questions/2533/linux-running-the-same-command-on-many-machines-at -once)并遇到此问题。 长期来看,我可能会看看这个链接问题的一个工具。对于简单的一次性,我想我可以在host1 host2 host3中为远程进行简单的设置。做“$ @”;完成了某种事情,根据需要插入'$ {remote}'。 我想唯一的方法来做到这一点(不写第二个脚本!)是'eval'?我可能会去重磅工具的海峡...... – Coderer 2012-08-03 08:37:59

相关问题