Как использовать расширенное значение переменной оболочки в имени другой переменной?

Я голодаю, пытаясь сделать следующее:

#!/bin/bash MARCOMIN=1 MARCOMAX=3 ENZOMIN=1 ENZOMAX=3 GIOVANNIMIN=1 GIOVANNIMAX=3 VALUEMARCO=12 VALUEGIOVANNI=4 VALUEENZO=12 for i in MARCO ENZO GIOVANNI; do echo $$iMIN is $i\'s MIN echo $$iMAX is $i\'s MAX echo $VALUE$i is $i\'s VALUE done exit 0 

Однако он не пишет макрос, как хотелось бы.

 me@myhost:~$ bash test.sh 20341iMIN is MARCO's MIN 20341iMAX is MARCO's MAX MARCO is MARCO's VALUE 20341iMIN is ENZO's MIN 20341iMAX is ENZO's MAX ENZO is ENZO's VALUE 20341iMIN is GIOVANNI's MIN 20341iMAX is GIOVANNI's MAX GIOVANNI is GIOVANNI's VALUE 

Очевидно, это только один из моих тестов. Я пробовал много разных способов писать макросы таким образом, но я не могу это исправить. Нашел много подобных вопросов здесь и на SO, но никто не соответствовал моему делу.

bash -x test.sh следует:

 + MARCOMIN=1 + MARCOMAX=3 + ENZOMIN=1 + ENZOMAX=3 + GIOVANNIMIN=1 + GIOVANNIMAX=3 + VALUEMARCO=12 + VALUEGIOVANNI=4 + VALUEENZO=12 + for i in MARCO ENZO GIOVANNI + echo 21466iMIN is 'MARCO'\''s' MIN 21466iMIN is MARCO's MIN + echo 21466iMAX is 'MARCO'\''s' MAX 21466iMAX is MARCO's MAX + echo MARCO is 'MARCO'\''s' VALUE MARCO is MARCO's VALUE + for i in MARCO ENZO GIOVANNI + echo 21466iMIN is 'ENZO'\''s' MIN 21466iMIN is ENZO's MIN + echo 21466iMAX is 'ENZO'\''s' MAX 21466iMAX is ENZO's MAX + echo ENZO is 'ENZO'\''s' VALUE ENZO is ENZO's VALUE + for i in MARCO ENZO GIOVANNI + echo 21466iMIN is 'GIOVANNI'\''s' MIN 21466iMIN is GIOVANNI's MIN + echo 21466iMAX is 'GIOVANNI'\''s' MAX 21466iMAX is GIOVANNI's MAX + echo GIOVANNI is 'GIOVANNI'\''s' VALUE GIOVANNI is GIOVANNI's VALUE + exit 0 

2 Solutions collect form web for “Как использовать расширенное значение переменной оболочки в имени другой переменной?”

Bash поддерживает переменную косвенность :

 #!/bin/bash MARCOMIN=1 MARCOMAX=3 ENZOMIN=1 ENZOMAX=3 GIOVANNIMIN=1 GIOVANNIMAX=3 VALUEMARCO=12 VALUEGIOVANNI=4 VALUEENZO=12 for i in MARCO ENZO GIOVANNI; do for j in MIN MAX VALUE; do varname="${i}${j}" # For VALUE we need reverse order of i and j [[ $j = VALUE ]] && varname="${j}${i}" printf "%d is %s's %s\n" "${!varname}" "$i" "$j" done done exit 0 

Я сделал немного больше с внутренним циклом и использовал printf вместо echo но основная идея заключается в том, что если имя переменной foo хранится в другой bar переменных, вы можете получить значение $foo , выполнив ${!bar} .

Подробнее: https://stackoverflow.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean

Для использования расширения переменной в имени другой переменной традиционно выполняется команда eval builtin shell. Это часто приводит к синдрому наклона зубочистки (много обратных косых черт и двойных побегов), что говорит о том, что может быть «лучший» способ выполнить то, что вы хотите сделать. Существуют также проблемы безопасности, связанные с использованием встроенного eval .

В любом случае, это один из способов добиться того, чего вы хотите:

 # ... eval echo \$${i}MIN is \$i\\\'s MIN eval echo \$${i}MAX is \$i\\\'s MAX eval echo \$VALUE${i} is \$i\\\'s VALUE # ... 
  • Расширение «$ @» для пользовательских переменных
  • Запустите команду, сохраненную в переменной, чтобы эхо в файл
  • Вставка переменных в команду в сценарии оболочки
  • Как использовать тройник для захвата STDOUT из кодового блока в имя файла, определенное в блоке?
  • Передать переменную с помощью EOF и использовать переменную хоста
  • Невозможно назначить вывод вложенных команд переменной в bash
  • Попытка присвоения не переменной?
  • Отложить переменное расширение до подоболочки
  • Функция проверки переменной BASH
  • Shell: как использовать 2 переменные с условием
  • bash - определяющие переменные с VAR = $ {: - по умолчанию}
  • Linux и Unix - лучшая ОС в мире.