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
为什么?
答案 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。如果这对您的代码来说是一个真正的问题,那么您将不得不发布一个新问题,其中包含您要完成的更多详细信息。
我希望这会有所帮助。