与用户定义的名称创建环境变量 - 间接变量扩展(creating environment varia

2019-10-22 04:57发布

我试图创建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"

它输出该用户已给予环境变量不被分配给它的值的名称。 如何呼应它的价值?

谢谢

Answer 1:

为了得到答案:任择议定书的问题归结为:

我怎样才能得到它的名字存储在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标准的严格壳将有没有功能。
  • kshzsh有相当的功能,但不同的语法。


文章来源: creating environment variable with user-defined name - indirect variable expansion