我有一个简单的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
答案 0 :(得分:3)
while
语句(以及它执行的read
命令)在同一个shell中执行。但是,read
会设置x
等的值。无论它读取什么,包括它在输入结束时看到的空/空行,导致它以非零状态退出。
如果要在没有可用输入时保留变量的值,则必须在read
中使用不同的变量,并设置x
等。在循环体中。
while read a b c; do
x=$a
y=$b
z=$c
done < "$INPUT"
现在,a
,b
和c
仍然是全局变量,但x
,y
和z
是仅在read
成功时修改。
答案 1 :(得分:3)
我相信这里发生的是读取失败,并在while循环结束时填充没有任何内容的变量。他们仍然应该在范围内。
澄清: 当它尝试读取时读取失败,当它到达文件末尾时没有任何东西可以读取。此时,while循环退出并清除变量(尽管变量仍在范围内)。