Как я могу получить значение переменной bash, если у меня есть имя переменной в виде строки?
var1="this is the real value"
a="var1"
Do something to get value of var1 just using variable a.
Контекст:
У меня есть несколько AMI ( Amazon Machine Image ), и я хочу запустить несколько экземпляров каждого AMI. Как только они закончат загрузку, я хочу настроить каждый экземпляр в соответствии с его типом AMI. Я не хочу запекать множество скриптов или секретных ключей внутри какого-либо AMI, поэтому я подготовил общий сценарий запуска и поместил его на S3 с общедоступной ссылкой. В rc.local я помещаю небольшой фрагмент кода, который выбирает сценарий запуска и выполняет его. Это все, что у меня есть в AMI. Затем каждый AMI обращается к общему сценарию конфигурации, который применим ко всем AMI, и специальным сценариям настройки для каждого. Эти сценарии являются частными и для доступа к ним требуется подписанный URL-адрес.
Итак, теперь, когда я запускаю экземпляр AMI (my_private_ami_1), я передаю подписанный URL для еще одного файла, представленного на S3, который содержит подписанный URL для всех частных скриптов с точки зрения пары ключ / значение.
config_url="http://s3.amazo.../config?signature"
my_private_ami_1="http://s3.amazo.../ami_1?signature"
...
Когда запускается сценарий, он загружает указанный выше файл и source
готово. Затем он проверяет свой тип AMI и выбирает для себя правильный сценарий установки.
ami\_type=GET AMI TYPE #ex: sets ami\_type to my\_private\_ami\_1
setup\_url=GET THE SETUP FILE URL BASED ON AMI\_TYPE # this is where this problem arises
Итак, теперь у меня есть общий код, который может запускать экземпляры независимо от их типов AMI, а экземпляры могут сами о себе позаботиться.
Bad substitution
ошибку./bin/sh
? Если да, попробуйте использовать/bin/bash
вместо этого. Начиная с Debian Squeeze, он/bin/sh
стал символической ссылкойdash
вместоbash
.dash
не поддерживает этот конкретный синтаксис и выдастBad substitution
ошибку.X=foo Y=X eval "Z=\$$Y"
устанавливает Z в "foo"
Будьте осторожны при использовании,
eval
так как это может привести к случайному запуску кода через значения в${Y}
. Это может причинить вред из-за внедрения кода.Например
Y="\`touch /tmp/eval-is-evil\`"
создаст
/tmp/eval-is-evil
. Это тоже могло бытьrm -rf /
, конечно.источник
Для моих коллег-пользователей zsh способ добиться того же, что и принятый ответ, - это использовать:
${(P)a}
Это называется заменой имени параметра.
источник
Изменил мои ключевые слова для поиска и понял :).
Спасибо за ваше время.eval a=\$$a
источник
${Y}
. Смотрите мое дополнение в ответе пользователя «анон».Была такая же проблема с массивами, вот как это сделать, если вы тоже манипулируете массивами:
array_name="ARRAY_NAME" ARRAY_NAME=("Val0" "Val1" "Val2") ARRAY=$array_name[@] echo "ARRAY=${ARRAY}" ARRAY=("${!ARRAY}") echo "ARRAY=${ARRAY[@]}" echo "ARRAY[0]=${ARRAY[0]}" echo "ARRAY[1]=${ARRAY[1]}" echo "ARRAY[2]=${ARRAY[2]}"
Это выведет:
источник
современные оболочки уже поддерживают массивы (и даже ассоциативные массивы). Поэтому, пожалуйста, используйте их и используйте меньше eval.
var1="this is the real value" array=("$var1") # or array[0]="$var1"
затем, когда вы хотите его вызвать, echo $ {array [0]}
источник
$1
)?На основании ответа: https://unix.stackexchange.com/a/111627
############################################################################### # Summary: Returns the value of a variable given it's name as a string. # Required Positional Argument: # variable_name - The name of the variable to return the value of # Returns: The value if variable exists; otherwise, empty string (""). ############################################################################### get_value_of() { variable_name=$1 variable_value="" if set | grep -q "^$variable_name="; then eval variable_value="\$$variable_name" fi echo "$variable_value" } test=123 get_value_of test # 123 test="\$(echo \"something nasty\")" get_value_of test # $(echo "something nasty")
источник
В bash 4.3 был введен тест '-v' для набора переменных. В то же время было добавлено объявление nameref. Эти две функции вместе с оператором косвенного обращения (!) Обеспечивают упрощенную версию предыдущего примера:
get_value() { declare -n var_name=$1 if [[ -v var_name ]] then echo "${var_name}" else echo "variable with name <${!var_name}> is not set" fi } test=123 get_value test 123 test="\$(echo \"something nasty\")" get_value test $(echo "something nasty") unset test get_value test variable with name <test> is not set
Поскольку этот подход устраняет необходимость в eval, он более безопасен. Этот код проверен в bash 5.0.3 (1).
источник