0

I'm trying to write a shell script which reads all the environment variables, evaluate them for included env. variable with in them and re-export after evaluvation.

Example - I've an environment variable exposed like this:

echo $JVM_OPTS                 
-Djava.awt.headless=true -Xmx1600m  -Djava.rmi.server.hostname=${CONTAINER_IP} -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Duser.language=en -Duser.country=US -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0


echo $CONTAINER_IP 
10.44.214.63

Now, I need to eval "JVM_OPTS" variable and substitute the value of ${CONTAINER_IP} in $JVM_OPTS to 10.44.214.63. Finally, set this evaluated value back in JVM_OPTS variable.

Sample Output:

echo $JVM_OPTS                 
    -Djava.awt.headless=true -Xmx1600m  -Djava.rmi.server.hostname=10.44.214.63 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Duser.language=en -Duser.country=US -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0

My Analysis so far: I wrote the below code to do the task

#!/bin/bash

for path in $(printenv); do
    path=`eval echo $path`
    echo $path
done

printenv would give the entire env. variable along with values. I just need the name and then use the value.

How to achieve this?

1

2 Answers 2

1

Basically, the solution is in your question: eval.

eval export JVM_OPTS=\"$JVM_OPTS\"
2
  • Yes, JVM_OPTS=eval echo $JVM_OPTS Also gave me the same output. But the problem is with the script. I managed to extract each env. variable, but unable to get its actual value. Commented Apr 6, 2016 at 11:32
  • @BandiKishore - This answer appears to answer your question, and very simply, without any loops. If you require to know how to parse the printenv output, you should rephrase your question. If that is what you need, then the following illustrates the parsing: printenv|while l=$(line); do echo ${l%%=*} is set to ${l#*=}; done.
    – AFH
    Commented Apr 6, 2016 at 11:53
0

The following worked for me.

for path in $(compgen -e) ; do
    eval "$path=\"${!path//\"/\\\"}\""
done

As posted at https://stackoverflow.com/a/36449824/1925997

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .