首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash变量-了解while循环后的作用域

bash变量-了解while循环后的作用域
EN

Stack Overflow用户
提问于 2014-10-29 18:23:18
回答 2查看 365关注 0票数 1

我有一个简单的bash脚本,如下所示。它接受一个csv文件作为第一个参数。

代码语言:javascript
复制
#!/bin/bash

x="John"
y="Dan"
z="Steve"

echo "x -- $x"
echo "y -- $y"
echo "z -- $z"

INPUT=$1
OLDIFS=$IFS
IFS=,
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 1; }
while read x y z
do
        echo "x: $x"
        echo "y: $y"
        echo "z: $z"
done < $INPUT
IFS=$OLDIFS

echo "x -- $x" #no value?
echo "y -- $y" #no value?
echo "z -- $z" #no value?

我想知道的是,为什么变量x、y和z在while循环运行后不保存任何字符串值?我知道while循环将在本地改变x、y和z的值。但是,我期望x、y和z分别为"John“、"Dan”和"Steve“,在while循环之后保持它们最初声明的值。或者至少保存csv解析循环给它的最后一个值,而不是空的。

while循环是否创建原始脚本上下文的子进程,然后继续该子进程?谢谢你的解释。

编辑#1

为上下文添加csv文件,以防有人想要运行它:

代码语言:javascript
复制
'P1','2014-10-31',0
'P1','2014-11-01',0
'P2','2014-11-07',0
'P2','2014-11-08',0
'P3','2014-11-14',0
'P3','2014-11-15',0
'P1','2014-11-21',1
'P1','2014-11-22',1
'P2','2014-12-05',1
'P2','2014-12-06',1
'P3','2014-12-12',1
'P3','2014-12-13',1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-29 18:26:45

我相信这里正在进行的是读取失败,并填充变量,没有在with循环的末尾。他们仍然应该在范围内。

澄清:当读取失败时,它尝试读取,当它到达文件的末尾时,没有什么可读的了。此时,while循环退出并清除变量(尽管变量仍在作用域中)。

票数 3
EN

Stack Overflow用户

发布于 2014-10-29 18:26:44

while语句(以及它执行的read命令)在同一个shell中执行。但是,read将设置x等的值。对于它读取的任何内容,包括它在输入末尾看到的空/空行,这将导致它以非零状态退出。

如果要在没有输入可用时保留变量的值,则必须在read中使用不同的变量,并设置x等。在循环的身体里。

代码语言:javascript
复制
while read a b c; do
    x=$a
    y=$b
    z=$c
done < "$INPUT"

现在,abc仍然是全局变量,但是xyz只有在read成功时才会被修改。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26637938

复制
相关文章

相似问题

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