在while循环条件下设置变量

时间:2011-08-30 21:22:13

标签: linux bash

GNU bash,版本4.1.5(1)-release-(i486-pc-linux-gnu) Ubuntu Linux 10.04

这将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

为什么?

1 个答案:

答案 0 :(得分: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

每个var赋值都在当前shell中执行,并且它们不属于read命令,因为它们不会被导出。

感谢操作系统和bash版本,但这对于bash,ksh,zsh以及其他可能正在“按设计运行”。如果你只是想知道为什么这会因为求知欲而发生,那么你需要花时间阅读advanced bash scripting。如果这对您的代码来说是一个真正的问题,那么您将不得不发布一个新问题,其中包含您要完成的更多详细信息。

我希望这会有所帮助。