В BASH есть способ прочитать имена переменных из переменной?

Это вопрос bash (отсюда размещение здесь в Unix и Linux)

У меня есть цикл while, который читается из 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 

🙁 Любые идеи, если (или желательно как) это возможно?

  • Переменная Shell в теге <a href>
  • Как вставить переменную в выражение даты?
  • Объем переменных при замещении процесса
  • BASH: использование awk для фильтрации уникальных строк приводит к 0 массиву длины
  • bash - чтение пользовательской переменной в скрипт bash grep
  • Защищенные переменные среды?
  • Как установить переменную в команду «git push»
  • Экспортировать командную строку без оценки вывода?
  • 3 Solutions collect form web for “В BASH есть способ прочитать имена переменных из переменной?”

    Я предполагаю, что вы настроили IFS для анализа CSV. По крайней мере, когда я это делаю, я получаю то же сообщение об ошибке, которое вы получаете:

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

    Это потому, что интерпретатор оболочки read $FIELDS с использованием $IFS , поэтому он ищет , чтобы отделить аргументы; таким образом, NAME PRETTY_NAME DESC заканчивается тем, что интерпретируется как один аргумент вместо трех, и результатом является недопустимое имя идентификатора.

    Использование массива, как было предложено GMaster, работает в этом случае:

     IFS=, FIELDS=(NAME PRETTY_NAME DESC) while read ${FIELDS[@]}; do echo $NAME done < some.csv 

    Использовать массивы bash

     FIELDS=(NAME PRETTY_NAME DESC) while read ${FIELDS[@]}; do echo $NAME done < some.csv 

    Лучшей практикой является установка IFS в цикле while, поэтому, как только цикл закончен, IFS возвращается к IFS, установленному оболочкой.

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

    Это POSIX-совместимый код.

    Linux и Unix - лучшая ОС в мире.