使用用户定义的名称创建环境变量 - 间接变量扩展
creating environment variable with user-defined name - indirect variable expansion
我正在尝试在 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"
它输出用户为环境变量指定的名称,而不是分配给它的值。如何回显其中的值?
谢谢
结束语:OP 的问题归结为:
如何获取名称存储在另一个变量[=97]中的变量值=]?
var='value' # the target variable
varName='var' # the variable storing $var's *name*
gniourf_gniourf在评论中提供了解决方案:
使用bash的间接扩展功能:
echo "${!varName}" # -> 'value'
varName
之前的 !
告诉 bash 不是 return $varName
的值,而是 的变量的值]name 是 $varName
.
的值
与直接变量引用(通常)不同,大括号({
和 }
)是必需的。
参见 https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
上面的页面还描述了形式 ${!prefix@}
和 ${!prefix*}
,其中 return 一个 变量名称列表 以 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 兼容的 shell 将没有任何功能。
ksh
和 zsh
具有相似的功能,但语法不同。
我正在尝试在 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"
它输出用户为环境变量指定的名称,而不是分配给它的值。如何回显其中的值?
谢谢
结束语:OP 的问题归结为:
如何获取名称存储在另一个变量[=97]中的变量值=]?
var='value' # the target variable
varName='var' # the variable storing $var's *name*
gniourf_gniourf在评论中提供了解决方案:
使用bash的间接扩展功能:
echo "${!varName}" # -> 'value'
varName
之前的 !
告诉 bash 不是 return $varName
的值,而是 的变量的值]name 是 $varName
.
的值
与直接变量引用(通常)不同,大括号({
和 }
)是必需的。
参见 https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
上面的页面还描述了形式 ${!prefix@}
和 ${!prefix*}
,其中 return 一个 变量名称列表 以 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 兼容的 shell 将没有任何功能。
ksh
和zsh
具有相似的功能,但语法不同。