【发布时间】:2023-03-08 20:11:01
【问题描述】:
我有一个简单的 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?
我想知道为什么在 while 循环运行后变量 x、y 和 z 不包含任何字符串值?我知道 while 循环会在本地更改 x、y 和 z 的值。但是,我希望 x、y 和 z 在 while 循环保持其最初声明的值之后分别为“John”、“Dan”和“Steve”。或者至少,保存 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
【问题讨论】:
-
没有。它替换循环中全局变量的内容。如果你想让它做,否则将循环放在一个函数中,并制作
x,y和zlocal。 -
顺便说一句,您不必保存/恢复 IFS。像这样调用您的读取:while IFS=, read x y z 仅将其设置为 while。
-
@ElliottFrisch 如果它替换了全局变量,为什么不将它们设置为脚本末尾 csv 文件最后一行中的值?它们只是空的。
-
因为 csv 文件的结尾导致脚本将 全局变量 设置为空。
标签: bash variables while-loop pipe subprocess