BASHには変数から変数名を読み取る方法はありますか? [閉鎖]

BASHには変数から変数名を読み取る方法はありますか? [閉鎖]

これは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互換コードです。

関連情報