我有一个简单的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分别为"John“、"Dan”和"Steve“,在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发布于 2014-10-29 18:26:45
我相信这里正在进行的是读取失败,并填充变量,没有在with循环的末尾。他们仍然应该在范围内。
澄清:当读取失败时,它尝试读取,当它到达文件的末尾时,没有什么可读的了。此时,while循环退出并清除变量(尽管变量仍在作用域中)。
发布于 2014-10-29 18:26:44
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成功时才会被修改。
https://stackoverflow.com/questions/26637938
复制相似问题