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

Nit*_*tin 5 linux shell

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

#!/bin/bash
CURRENT_PROCESS_ID=$$
var=METASTORE_JDBC_DRIVER_$CURRENT_PROCESS_ID
echo $var
export $var='1'
Run Code Online (Sandbox Code Playgroud)

执行命令

bash <filename>.sh
Run Code Online (Sandbox Code Playgroud)

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

Doc*_*ger 8

Bash版本2 ${!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
Run Code Online (Sandbox Code Playgroud)

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

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


Eri*_*dek 6

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

source <filename>.sh
Run Code Online (Sandbox Code Playgroud)

只是为了显示子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
Run Code Online (Sandbox Code Playgroud)