linux - 在 while 循环条件中设置变量

标签 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

对/对

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/

相关文章:

linux - 性能调用图中的源代码行号?

python - CLIPSpy:获取 "No module name ' clips._clips'”导入剪辑

linux - 递归地创建文件夹的新 tar 文件,排除另一个 tar 文件中包含的文件

linux - 在许多文件中用多行替换字符串

linux - 使用shell脚本删除文件夹内容

database - Bash 在指定行编辑文件中的最后一个字符

linux - 按文本查找行并从该行删除到 bash 中的其他行

linux - 如何从内核中的 UDP 读取缓冲区中删除数据包?

linux - 将输出重定向到文件 shell 脚本

linux - 用于批量重命名文件夹中文件的 Shell/Bash 快捷方式