2011-08-30 144 views
0

GNU的bash,版本4.1.5(1)-release-(1486-PC-Linux的GNU) Ubuntu Linux操作系统的10.04设置变量while循环

这将打印VAR为1234,不打印VAR2

#!/bin/bash 

var=1234 

while var=9876 var2=765 read line 
do 

    echo $var $var2 
    echo $line 

done <datafile 

echo out of loop $var 

O/p

1234 
This is line 1 
1234 
This is line 2 
1234 
This is line 3 
1234 
This is line 4 
1234 
This is line 5 
1234 
This is line 6 
1234 

out of loop 1234 

这将打印var当成9876和还打印VAR2

#!/bin/bash 

var=1234 

while 
var=9876 
var2=765 
read line 
do 

    echo $var $var2 
    echo $line 

done <datafile 

echo out of loop $var 

O/P

9876 765 
This is line 1 
9876 765 
This is line 2 
9876 765 
This is line 3 
9876 765 
This is line 4 
9876 765 
This is line 5 
9876 765 
This is line 6 
9876 765 

out of loop 9876 

这是为什么?

回答

2

编辑我看到现在,你的第一个脚本产生的1234这个输出发生,因为VAR1在主脚本范围的,但读默默地消耗VAR1和VAR2,因为它们是本地范围,以只是行var = 9876 var2 = 764 read ...,如下所述。

主要原创帖子:根据旧学校的unix,命令行可以包含预定义的变量赋值,其作用域仅为紧随其后的命令。

所以你行

while var=9876 var2=765 read line 
     ^--prepened Vars--^cmd^args 

解析像^---表示。

由于前置增值变量只属于他们“附加”的命令,在这种情况下为read,它们只对该过程可见。 (读取可能是内部命令,这可能是问题的一部分)。

相比之下,你的代码的第二块,

while 
var=9876 
var2=765 
read line 

每个变种分配当前shell内执行,他们不“属于”到read命令监守他们不出口。

感谢操作系统和bash版本,但这是'为设计运作'为bash,ksh,zsh和其他人。如果你只是想知道为什么这是为了知识的好奇而发生的,那么你需要花时间阅读advanced bash scripting。如果这代表您的代码存在真正的问题,那么您必须发布一个新问题,提供更多关于您要实现的细节的信息。

我希望这会有所帮助。

+0

我添加了脚本输出和bash/OS版本。 – abc

+0

这有助于。但是,您能告诉我需要阅读的Adv Bash脚本指南中哪些部分? – abc

+0

这些将有助于:http://tldp.org/LDP/abs/html/subshel​​ls.html和http://tldp.org/LDP/abs/html/othertypesv.html但不明确回答我的方式'重新定义'你的问题。我会进一步寻找或创建一小段脚本,以说明我的观点,如果/有时间的话。祝你好运。 – shellter