bash + как определить переменную массива с номером экземпляра

Можно ли определить переменную, которая называется, например, machine1, как машинный счетчик $ (while counter = 1)?

Например, я создал файл /tmp/config.txt и установил machine1 как массив:

  $ more /tmp/config.txt machine1=( linux_server critical 1.1.1.1 ) machine2=( linux_server critical 1.1.1.2 ) . . 

Затем я создал следующий простой скрипт для чтения /tmp/config.txt . И я пытаюсь напечатать массив машин следующим образом:

  $ more read.config.bash #!/bin/bash source /tmp/config.txt counter=1 echo ${machine$counter[0]} echo ${machine$counter[1]} echo ${machine$counter[2]} . . 

Но когда я запускаю скрипт, я получаю:

 $ ./read.config.bash ./read.config.bash: line 6: ${machine$counter[0]}: bad substitution ./read.config.bash: line 7: ${machine$counter[1]}: bad substitution ./read.config.bash: line 8: ${machine$counter[2]}: bad substitution 

Каково решение этой проблемы?

2 Solutions collect form web for “bash + как определить переменную массива с номером экземпляра”

Используйте команду eval .

 eval "echo \${machine${counter[0]}}" 

Обратите внимание, что первый $ экранирован, так что он не оценивается до тех пор, пока eval обработает строку.

Способ, которым это работает, заключается в том, что eval выполняет команду так же, как если бы вы набрали ее в командной строке. Разница в том, что выполняемая команда может быть построена программно.

Таким образом, в вашем сценарии, когда eval работает над командой, команда, которую он выполняет, выглядит следующим образом: echo ${machineBLAH} . Внутренняя подстановка переменных уже выполнялась отдельно оболочкой перед прогонами eval .

Для получения дополнительной информации см. Это другое сообщение: Что такое команда eval в bash? ,

Вы можете избежать использования eval

 source /tmp/config.txt counter=1 line0="machine$counter[0]" echo ${!line} 

И гораздо лучше называть echo через цикл

 for counter in 1 2 3 do line="machine$counter[@]" for element in "${!line}" do echo $element done done 
  • bash: четкая строка между двумя позициями
  • Нужен скрипт, который генерирует файлы из слов в одном текстовом файле
  • скрипт для подсчета файлов в каталоге
  • Сценарий оболочки для обнаружения PDF-файлов с содержимым, отличным от ASCII
  • Получение истинного абсолютного пути сценария в / bin / sh
  • Как установить глобальные переменные среды при загрузке через сценарий и сделать их доступными для приложения, которое запускается до входа в систему?
  • Определение функции bash динамически с использованием eval
  • Подсчитайте строки, соответствующие шаблону и соответствующие предыдущей строке
  • Как перебирать переменную, пропуская одно из значений?
  • получить бесплатную строку жанра id3-tag, а не только номер жанра в сценарии bash
  • Самораспаковывающиеся скрипты: tar -xO и dd
  • Linux и Unix - лучшая ОС в мире.