bash变量 - 在while循环后理解范围

时间:2014-10-29 18:23:18

标签: bash variables while-loop pipe subprocess

我有一个简单的bash脚本如下。它需要一个csv文件作为第一个参数。

#!/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成为&#34; John,&#34; &#34;丹,&#34;和#34;史蒂夫,&#34;在while循环之后保持其最初声明的值。或者至少,保持csv解析循环给它的最后一个值,而不是空。

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

编辑#1

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

'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

2 个答案:

答案 0 :(得分:3)

while语句(以及它执行的read命令)在同一个shell中执行。但是,read会设置x等的值。无论它读取什么,包括它在输入结束时看到的空/空行,导致它以非零状态退出。

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

while read a b c; do
    x=$a
    y=$b
    z=$c
done < "$INPUT"

现在,abc仍然是全局变量,但xyz是仅在read成功时修改。

答案 1 :(得分:3)

我相信这里发生的是读取失败,并在while循环结束时填充没有任何内容的变量。他们仍然应该在范围内。

澄清: 当它尝试读取时读取失败,当它到达文件末尾时没有任何东西可以读取。此时,while循环退出并清除变量(尽管变量仍在范围内)。