В 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 

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

  • Как принять переменную
  • Вставьте переменную и сохраните переменную
  • Почему bash не расширяет эту переменную, если я префикс команды с назначением одноразовой переменной
  • Вставка переменной в определенном месте с помощью sed
  • Экспортировать командную строку без оценки вывода?
  • Переменная, связанная с переменной
  • Установка переменных среды по приглашению вместо командной строки
  • объединение имен файлов в переменную
  • 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

    Неверное отображение персонажа в приложениях, связанных с Интернетом

    установить раздел секций freebsd под linux

    Как я могу криптографически проверить sabayon.iso? Есть ли сертификаты?

    Почему Linux не защищает ОС от обмена?

    показывать только теги XML-документа в командной строке

    Как копировать только каталоги с определенным файлом в этом каталоге

    Старые компьютеры не стабильны с монетным двором 17

    mount: warning: / etc / mtab не доступен для записи (например, файловая система только для чтения)

    Не удается удалить ttyS0 из / etc / securetty

    Проверка состояния батареи Arch Linux установка ISO

    Evince не показывает принтеры

    Как установить скорость повторения клавиатуры USB с помощью udev?

    Установите по умолчанию режим vi-mode Bash в «обычный» режим Vi (не «вставить») и поместите курсор в начало строки, подражая KornShell

    Рабочая станция Fedora 25: Anaconda выбрасывает ошибку Traceback во время установки

    «Именованный» раб такой же, как и форвардеры?

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