これはbashの質問です(したがってUnixとLinuxに公開されています)。
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
これは、シェルがread $FIELDS
構文解析を使用して区切られた引数を$IFS
見つけるため、最終的に3つではなく単一の引数として解釈され、結果が無効な識別子名になるためです。,
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
使用バッシュ配列
FIELDS=(NAME PRETTY_NAME DESC)
while read ${FIELDS[@]}; do
echo $NAME
done < some.csv
答え3
ベストプラクティスは、whileループ内でIFSを設定することです。したがって、ループが完了すると、IFSはシェルで設定したIFSに戻ります。
FIELDS="NAME PRETTY_NAME DESC"
while IFS="," read -r $FIELDS; do
echo $NAME
done < some.csv
これはPOSIX互換コードです。