首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在while循环条件中设置变量

在while循环条件中设置变量
EN

Stack Overflow用户
提问于 2011-08-31 05:22:13
回答 1查看 539关注 0票数 0

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

这会将var打印为1234,但不会打印var2

代码语言:javascript
运行
复制
#!/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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#!/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

代码语言:javascript
运行
复制
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

为什么会这样呢?

EN

Stack Overflow用户

回答已采纳

发布于 2011-08-31 06:01:38

编辑我现在看到你的第一个脚本产生了1234的输出。之所以会发生这种情况,是因为var1的作用域是在主脚本中,但是read正在默默地使用var1和var2,因为它们的作用域是本地的,只需要一行var=9876 var2=764 Read...,如下所述。

主要起源于post:根据老派的unix,命令行可以包含预先挂起的变量赋值,其作用域只是紧随其后的命令。

所以你的台词

代码语言:javascript
运行
复制
while var=9876 var2=765 read line
      ^--prepened Vars--^cmd^args

按照^---指示的方式进行解析。

因为预先挂起的var只属于它们“附加”到的命令,在本例中是read,它们只对该进程可见。(read可能是一个内部命令,这可能是问题的一部分)。

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

代码语言:javascript
运行
复制
while 
var=9876 
var2=765 
read line

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

感谢你的操作系统和bash版本,但这是bash、ksh、zsh和其他版本的“设计功能”。如果你只是出于对知识的好奇而想知道为什么会发生这种情况,那么你需要花时间阅读advanced bash scripting。如果这对你的代码来说是一个真正的问题,那么你将不得不发布一个新的问题,其中包含关于你试图实现的更多细节。

我希望这能帮到你。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7249976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档