이것은 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 호환 코드입니다.