【问题标题】:creating environment variable with user-defined name - indirect variable expansion使用用户定义的名称创建环境变量 - 间接变量扩展
【发布时间】:2015-05-09 04:46:24
【问题描述】:

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

它输出用户赋予环境变量的名称,而不是分配给它的值。如何在其中回显值?

谢谢

【问题讨论】:

  • 使用间接:echo "${!varName}".
  • 另外请记住,变量名中只允许使用某些字符[a-zA-Z0-9_],但用户可以输入任何内容。
  • 它有效:D 谢谢@gniourf_gniourf
  • 将过多的权力传递给用户是非常糟糕的。

标签: bash shell indirection


【解决方案1】:

结束:OP的问题归结为:

如何获取 name 存储在 另一个 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+支持更灵活机制:namerefs,通过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 来更新 original 变量

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 的 shell 将没有这两个功能。
  • kshzsh 具有相似的功能,但语法不同。

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 2023-03-30
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多