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

Я пытаюсь создать переменную среды в сценарии bash, пользователь вводит имя создаваемой переменной среды и также вводит ее значение.

это жестко закодированный способ просто уточнить мой вопрос:

#!/bin/bash
echo Hello 
export varName="nameX" #
echo $varName 
export "$varName"="val" #here I am trying to create an environment 
#variable  whose name is nameX and assigning it value val
echo $nameX 

он отлично работает, его вывод:

Hello
nameX
val

Но я хочу общий код. Итак, я пытаюсь получить от пользователя имя переменной и ее значение, но у меня возникают проблемы с этим. Я не знаю, как эхо-переменная, имя которой определяется пользователем

echo "enter the environment variable name"
read varName
echo "enter the value to be assigned to env variable"
read value
export "$varName"=$value

Теперь я не знаю, как повторить переменную среды, если мне это нравится:

echo "$varName"

он выводит имя, которое пользователь дал переменной среды, а не значение, которое ей присвоено. как повторить значение в нем?

Спасибо


person Bramsh    schedule 07.03.2015    source источник
comment
Используйте косвенность: echo "${!varName}".   -  person gniourf_gniourf    schedule 07.03.2015
comment
Также имейте в виду, что в имени переменной разрешены только определенные символы [a-zA-Z0-9_], но пользователь может ввести что угодно.   -  person anubhava    schedule 07.03.2015
comment
это работает :D спасибо @gniourf_gniourf   -  person Bramsh    schedule 07.03.2015
comment
очень плохо передавать пользователю слишком много энергии.   -  person Jason Hu    schedule 08.03.2015


Ответы (1)


Чтобы получить закрытие: вопрос ОП сводится к следующему:

Как я могу получить значение переменной, имя которой хранится в другой переменной в bash?

var='value'    # the target variable
varName='var'  # the variable storing $var's *name*

gniourf_gniourf предоставил решение в комментарии:

Используйте функцию bash косвенное расширение:

echo "${!varName}"  # -> 'value'

!, предшествующий varName, указывает bash возвращать не значение $varName, а значение переменной, name которой является значением $varName.
Закрывающие фигурные скобки ({ и }) обязательны, в отличие от прямых ссылок на переменные (обычно).
См. https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

На странице выше также описаны формы ${!prefix@} и ${!prefix*}, которые возвращают список имен переменных, начинающихся с prefix.


bash 4.3+ поддерживает более гибкий механизм: ссылки имен через declare -n или внутри функций local -n:

Примечание. Для конкретного случая использования косвенное расширение является более простым решением.

var='value'

declare -n varAlias='var'  # $varAlias is now another name for $var

echo "$varAlias" # -> 'value' - same as $var

Преимущество такого подхода заключается в том, что nameref фактически просто другое имя для исходной переменной (место хранения), поэтому вы также можете назначить для nameref для обновления исходной переменной:

varAlias='new value'  # assign a new value to the nameref

echo "$var" # -> 'new value' - the original variable has been updated

См. https://www.gnu.org/software/bash/manual/html_node/Shell-Parameters.html


Примечание о совместимости:

  • Косвенное расширение и ссылки на имена НЕ совместимы с POSIX; строго совместимая с POSIX оболочка не будет иметь ни одной из этих функций.
  • ksh и zsh имеют схожие функции, но с разным синтаксисом.
person mklement0    schedule 07.03.2015