В 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 

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

  • расширение переменных в awk
  • Объем переменных при замещении процесса
  • Почему значение переменной не изменяется внутри backticks?
  • Повторное использование выхода grep
  • Передать переменный IP-адрес, если иначе
  • Игнорировать определенные символы при сравнении переменных?
  • BASH: передать аргументы в подзапись
  • Создать текст, соответствующий нескольким назначениям переменных из одной переменной
  • 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-совместимый код.

    Interesting Posts

    Почему мой rsync не разрешает размер блока> 128 КБ?

    Правильно ли задавать переменную $ TERM вручную?

    Как отключить / включить сенсорную панель для Lenovo Yoga 900 13ISK2

    Простой «переменный» файл Bash

    Каждый результат grep для разных файлов

    Как добавить к переменной среды с помощью файла .env?

    Удалить старые каталоги в соответствии с именем каталога?

    Есть ли способ сделать функцию просмотра vnc, например, Xming, позволяя свободно перемещать окна Linux?

    Поддерживает ли клавиатурная интерактивная аутентификация два последовательных пароля?

    Как обновить только важные пакеты безопасности в redhat 5.6

    Как отключить экран входа в список пользователей в Gnome 3 на Fedora 16 или 17?

    Подключение к WEP WiFi / wlan0 с использованием Minimal Debian Wheezy

    Unix: поиск файлов конфигурации службы в файловой системе

    Что означает ошибка = продолжить настройку монтирования?

    дождитесь завершения подключения autossh

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