使用用户定义的名称创建环境变量 - 间接变量扩展

时间:2015-03-07 17:56:46

标签: bash shell indirection

我正在尝试在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"

它输出用户给环境变量的名称而不是分配给它的值。如何回应它的价值?

由于

1 个答案:

答案 0 :(得分:2)

关闭:OP的问题归结为:

我如何获取名称存储在bash 另一个变量中的变量的值?

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

gniourf_gniourf在评论中提供了解决方案:

使用bash的间接扩展功能:

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

!之前的varName告诉bash不要返回$varName的值,而是 name 的值为{{的值的变量值1}}。
括号花括号($varName{)是必需的,与直接变量引用(通常)不同。
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

上面的页面还介绍了表单}${!prefix@},它们返回以${!prefix*}开头的变量名称列表。


prefix 支持更灵活的机制: namerefs ,通过bash 4.3+或内部函数{{ 1}}:

注意:对于手头的具体用例,间接扩展是更简单的解决方案。

declare -n

这种方法的优点是nameref 实际上只是原始变量的另一个名称(存储位置),所以你也可以分配 nameref 更新原始变量

local -n

请参阅https://www.gnu.org/software/bash/manual/html_node/Shell-Parameters.html


兼容性说明

  • 间接扩展和namerefs不符合POSIX标准;严格遵守POSIX的shell将不具备任何功能。
  • var='value' declare -n varAlias='var' # $varAlias is now another name for $var echo "$varAlias" # -> 'value' - same as $var varAlias='new value' # assign a new value to the nameref echo "$var" # -> 'new value' - the original variable has been updated 具有相似的功能,但语法不同。