No BASH existe uma maneira de ler os nomes das variáveis de uma variável? [fechadas]

1

Esta é uma questão bash (portanto, postar aqui no Unix e Linux)

Eu tenho um loop while que lê de um csv; Parece algo assim:

while read NAME PRETTY_NAME DESC; do
     echo $NAME
done < some.csv

E isso tudo funciona de maneira adorável; mas o que eu realmente adoraria fazer é definir os nomes dos campos em uma variável; assim:

FIELDS="NAME PRETTY_NAME DESC"
while read $FIELDS; do
     echo $NAME
done < some.csv

mas infelizmente parece que não é aceitável:

-bash: read: 'NAME PRETTY_NAME DESC': not a valid identifier

:( Alguma idéia se (ou de preferência como) isso é possível?

    
por Jeremy Davis 17.03.2015 / 07:21

3 respostas

3

Suponho que você tenha definido IFS para , para analisar o CSV. Pelo menos quando faço isso, recebo a mesma mensagem de erro:

IFS=,
FIELDS="NAME PRETTY_NAME DESC"
while read $FIELDS; do
    echo $NAME
done < some.csv

Isso porque o shell analisa read $FIELDS usando $IFS , portanto, ele procura , para separar os argumentos; assim, NAME PRETTY_NAME DESC acaba sendo interpretado como um único argumento em vez de três, e o resultado é um nome de identificador inválido.

Usar uma matriz conforme sugerido por GMaster funciona neste caso:

IFS=,
FIELDS=(NAME PRETTY_NAME DESC)
while read ${FIELDS[@]}; do
   echo $NAME
done < some.csv
    
por 17.03.2015 / 07:25
3

Use matrizes do bash

FIELDS=(NAME PRETTY_NAME DESC)
while read ${FIELDS[@]}; do
  echo $NAME
done < some.csv
    
por 17.03.2015 / 07:32
1

A melhor prática é definir o IFS no loop while, assim que o loop for concluído, o IFS retornará ao IFS definido pelo shell.

FIELDS="NAME PRETTY_NAME DESC"
while IFS="," read -r $FIELDS; do
     echo $NAME
done < some.csv

Este é um código compatível com POSIX.

    
por 17.03.2015 / 14:25

Tags