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
对/对
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
对/对
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
这是为什么?
最佳答案
编辑 我现在看到您的第一个脚本正在生成 1234 的输出。发生这种情况是因为 var1 在主脚本中的作用域但是读取正在静默地消耗 var1 和 var2,因为它们在本地作用域为只有 var=9876 var2=764 行读作 ... 如下所述。
主要是原帖:对于旧式 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 .如果这对您的代码来说是一个真正的问题,那么您将不得不发布一个新问题,其中包含有关您要完成的工作的更多详细信息。
希望对您有所帮助。
关于linux - 在 while 循环条件中设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7249976/