Chris
Chris

Reputation: 2060

BashScripting: Reading out a specific variable

my question is actually rather easy, but I suck at bash scripting and google was no help either. So here is the problem: I have an executable that writes me a few variables to stdout. Something like that:

MrFoo:~$ ./someExec 
Variable1=5
Another_Weird_Variable=12
VARIABLENAME=42

What I want to do now is to read in a specific one of these variables (I already know its name), store the value and use it to give it as an argument to another executable.

So, a simple call like

./function2 5  // which comes from ./function2 Variable1 from above

I hope you understand the problem and can help me with it

Upvotes: 0

Views: 66

Answers (6)

k_vishwanath
k_vishwanath

Reputation: 1585

If you want to use only one variable from the file use the below

eval $(grep 'Variable1' ./someExec )
./function2 $Variable1

And, if you want to use all the variables of a file, use

eval $(./someExec)
./function2 $<FILE_VARIBALE_NAME>

Upvotes: 0

Kambus
Kambus

Reputation: 3654

If you can make sure someExec's output is safe you can use eval.

eval $(./someExec)
./function2 $Variable1

Upvotes: 1

Enigma
Enigma

Reputation: 71

You can use this very simple and straight forward way:

./exp1.sh | grep "Variable1" | awk -F "=" '{print $2}' 

Upvotes: 0

jaypal singh
jaypal singh

Reputation: 77075

With awk you can do something like this (this is for passing value of 1st variable)

./someExec | awk -F= 'NR==1{system("./function2 " $2)}'

or

awk -F= 'NR==1{system("./function2 " $2)}' <(./someExec)

Upvotes: 2

anubhava
anubhava

Reputation: 784898

You can use awk like this:

./function2 $(./someExec | awk -F "=" '/Variable1/{print $2}')

which is equivalent to:

./function2 5

Upvotes: 1

Palpatim
Palpatim

Reputation: 9262

Easiest way to go is probably to use a combination of shell and perl or ruby. I'll go with perl since it's what I cut my teeth on. :)

someExec.sh

#!/bin/bash
echo Variable1=5
echo Another_Weird_Variable=12
echo VARIABLENAME=42

my_shell_script.sh

#!/bin/bash
myVariable=`./someExec | perl -wlne 'print $1 if /Variable1=(.*)/'`
echo "Now call ./function2 $myVariable"

[EDIT] Or awk, as Jaypal pointed out 58 seconds before I posted my answer. :) Basically, there are a lot of good solutions. Most importantly, though, make sure you handle both security and error cases properly. In both of the solutions so far, we're assuming that someExec will provide guaranteed well-formed and innocuous output. But, consider if someExec were compromised and instead provided output like:

./someExec
5 ; rm -rf / # Uh oh...

Upvotes: 1

Related Questions