在bash shell脚本中导出具有动态创建名称的变量

时间:2013-01-28 16:58:12

标签: linux shell

我想创建一个名称部分动态的变量,并从我的bash shell脚本中导出它。我一直试图通过以下方式来做到这一点。虽然没有成功。请告诉我我错在哪里。

#!/bin/bash
CURRENT_PROCESS_ID=$$
var=METASTORE_JDBC_DRIVER_$CURRENT_PROCESS_ID
echo $var
export $var='1'

执行命令

bash <filename>.sh

我希望脚本会创建一个像METASTORE_JDBC_DRIVER_8769这样的环境变量,我应该能够在剧本中使用它,但是当我做的时候 脚本外的echo $METASTORE_JDBC_DRIVER_8769不会给我任何东西。欢迎任何建议/想法。

2 个答案:

答案 0 :(得分:8)

Bash版本2为动态创建的变量名称(a.k.a“间接引用”)引入了更直观的表示法${!var} ...

a=letter_of_alphabet
letter_of_alphabet=z

echo "a = $a"           # Direct reference.

echo "Now a = ${!a}"    # Indirect reference.  (a = z)
#  The ${!variable} notation is more intuitive than the old
#+ eval var1=\$$var2

有关详细信息和示例,请参阅http://tldp.org/LDP/abs/html/bashver2.html#EX78

有关使用更为人熟知的eval var1=\$$var2技术的详细信息和示例,请参阅http://tldp.org/LDP/abs/html/ivr.html

答案 1 :(得分:6)

将导出导出到当前shell上下文中。通过使用bash运行脚本,它将在shell的上下文中设置。您需要获取文件以使其在当前shell上下文中运行。

source <filename>.sh

只是为了显示子shell和源之间的区别:

[nedwidek@yule ~]# bash test.sh
METASTORE_JDBC_DRIVER_8422
[nedwidek@yule ~]# env |grep META
[nedwidek@yule ~]# source test.sh
METASTORE_JDBC_DRIVER_8143
[nedwidek@yule ~]# env |grep META
METASTORE_JDBC_DRIVER_8143=1