这是一个 bash 问题(因此在 Unix&Linux 中发布)
我有一个 while 循环从 csv 中读取;它看起来像这样:
while read NAME PRETTY_NAME DESC; do
echo $NAME
done < some.csv
一切都很顺利;但我真正想做的是在变量中定义字段名称;像这样:
FIELDS="NAME PRETTY_NAME DESC"
while read $FIELDS; do
echo $NAME
done < some.csv
但不幸的是,这似乎是不可接受的:
-bash: read: `NAME PRETTY_NAME DESC': not a valid identifier
:( 如果(或者最好是如何)这可能的话,有什么想法吗?
答案1
我猜您已经设置IFS
为,
解析 CSV。至少当我这样做时,我收到了与您相同的错误消息:
IFS=,
FIELDS="NAME PRETTY_NAME DESC"
while read $FIELDS; do
echo $NAME
done < some.csv
这是因为 shellread $FIELDS
使用进行解析$IFS
,因此它会寻找,
分隔参数;因此NAME PRETTY_NAME DESC
最终会被解释为单个参数而不是三个参数,并且结果是一个无效的标识符名称。
FIELDS
在作品中使用逗号代替空格:
IFS=,
FIELDS="NAME,PRETTY_NAME,DESC"
while read $FIELDS; do
echo $NAME
done < some.csv
或者,您可以按照建议使用数组大师:
IFS=,
FIELDS=(NAME PRETTY_NAME DESC)
while read ${FIELDS[*]}; do
echo $NAME
done < some.csv
答案2
使用bash 数组
FIELDS=(NAME PRETTY_NAME DESC)
while read ${FIELDS[@]}; do
echo $NAME
done < some.csv
答案3
最佳实践是在 while 循环中设置 IFS,因此一旦循环完成,IFS 将返回到 shell 设置的 IFS。
FIELDS="NAME PRETTY_NAME DESC"
while IFS="," read -r $FIELDS; do
echo $NAME
done < some.csv
这是符合 POSIX 标准的代码。