在 BASH 中,有没有办法从变量中读取变量名称?

在 BASH 中,有没有办法从变量中读取变量名称?

这是一个 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 标准的代码。

相关内容