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찾기 때문에 결국 세 개가 아닌 단일 인수로 해석되고 결과는 유효하지 않은 식별자 이름이 되기 때문입니다.,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 호환 코드입니다.

관련 정보