我试图创建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"
它输出该用户已给予环境变量不被分配给它的值的名称。 如何呼应它的价值?
谢谢
为了得到答案:任择议定书的问题归结为:
我怎样才能得到它的名字存储在bash的另一个变量一个变量的值 ?
var='value' # the target variable
varName='var' # the variable storing $var's *name*
gniourf_gniourf提供了注释的解决方案:
使用bash的间接扩展功能:
echo "${!varName}" # -> 'value'
该!
前面varName
告诉bash不能返回的值$varName
,但他的名字变量的值是价值$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更新原始变量 :
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
兼容性注意 :
- 间接膨胀和namerefs不符合POSIX标准; 符合POSIX标准的严格壳将有没有功能。
-
ksh
和zsh
有相当的功能,但不同的语法。
文章来源: creating environment variable with user-defined name - indirect variable expansion