Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Export a variable with dynamically created name in bash shell script

Tags:

linux

shell

I want to create a variable with its name partly dynamic and export it from my bash shell script. I have been trying to do it the following way. No success though. Please tell me where I am wrong.

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

execution command

bash <filename>.sh

I am hoping the script would create an environmental variable like METASTORE_JDBC_DRIVER_8769 and I should be able to use that out of the script but when I do echo $METASTORE_JDBC_DRIVER_8769 outside the script, doesn't give me anything. Any suggestions/ideas are welcomed.

like image 408
Nitin Avatar asked Jan 28 '13 16:01

Nitin


People also ask

Can export be a variable name?

export makes the variable available to sub-processes. means that the variable name is available to any process you run from that shell process. If you want a process to make use of this variable, use export , and run the process from that shell.


2 Answers

Bash version 2 introduced the much more intuitive notation ${!var} for dynamically created variable names (a.k.a "indirect referencing")...

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

For details and examples, see http://tldp.org/LDP/abs/html/bashver2.html#EX78

For details and examples using the more well-known eval var1=\$$var2 technique, see http://tldp.org/LDP/abs/html/ivr.html

like image 157
DocSalvager Avatar answered Oct 15 '22 19:10

DocSalvager


Export exports variables into the current shell context. By running your script with bash it gets set in that shell's context. You need to source the file to have it run in the current shell context.

source <filename>.sh

Just to show the difference between a sub-shell and source:

[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
like image 31
Erik Nedwidek Avatar answered Oct 15 '22 19:10

Erik Nedwidek