Cari Baur
Cari Baur

Reputation: 169

Using variables in bash script to set ini-file values while executing

I am quite new to bash scripting, but haven't found an answer to the following problem yet. I hope somebody can either tell me or give me tips on how to do it.

Background: I have a program (say "program") that accepts an ini-file (say "input.ini") as input taking a while to execute. A variable in the ini-file for the programm might be "number" for instance, which might be set to number=1.

Problem: I have to call ./program input.ini quite often, but with different values for "number", say 1,2,3,4,5. I thought, I could write a bash script executing the program in a for-loop setting "number" accordingly. The loop is not a problem, but setting "number" in the ini-file. (I tried e.g. number=$VALUE in the ini-file with VALUE being set in the script, but this does not work.)

Question: How can I set a variable in the ini-file using a bash-script? (This does not have to be permanent, but only for that run of the program.)

Additional question: Setting a variable in the ini-file is one thing. In addition, it would be great to do the following as well (I thought that might work similarly...): The program produces some output files. The names of these files can also be set in the ini-file, say via "output_name=filename.out". It would be great now if there was something like "output_name=filename_$VALUE.out" to set the output names accordingly.

I hope it is clear what I try to do and I would be really grateful if somebody had a solution or hints on how to do it.

Thanks, Cari

Upvotes: 1

Views: 3653

Answers (4)

VDPasha
VDPasha

Reputation: 11

full parsed and set ini file (section,key,value) and save on root.

sudo_setini ()
{
 fkey=false
 fsec=false
 tsec=false
 res=""

 if [ -f "$1" ]; then
 while IFS= read -r LINE
 do
  TLINE=`echo $LINE`
  if [[ $TLINE == \[*] ]]; then
   TLINE=`echo ${TLINE:1:${#TLINE}-2}`
   if [[ _${TLINE} == _$2 ]]; then
    tsec=true
    fsec=true
   else
    if $tsec && ! $fkey ; then
     res+=$'\n'$3=$4
    fi
    tsec=false
   fi
   res+=$'\n'${LINE}
  else   
   TLINE=`echo ${TLINE%%=*}`
   if $tsec && [[ _${TLINE} == _$3 ]]; then
    fkey=true
    res+=$'\n'${LINE%%=*}=$4
   else
    res+=$'\n'${LINE}
   fi
  fi
 done < $1
 fi

 if $tsec && ! $fkey ; then
  res+=$'\n'$3=$4
 fi

 if ! $fsec ; then
  res+=$'\n'[$2]
  res+=$'\n'$3=$4
 fi
 echo "$res" | sudo tee "$1" > /dev/null
}

 sudo_setini 'test.ini' 'General' 'Type' 'Digital_'

Upvotes: 1

kvz
kvz

Reputation: 5885

If you have git available and you're not worried about indentation, a hack could be to use git config.

Example:

$ git config -f settings.ini server.ip 123.123.123.123
$ cat settings.ini
[server]
    ip = 123.123.123.123

$ git config -f settings.ini server.ip 123.123.123.124
$ cat settings.ini
[server]
    ip = 123.123.123.124

Upvotes: 0

that other guy
that other guy

Reputation: 123570

If you have a file that contains number=something, you can replace "something" with "5" using sed "/^number=/s/=.*/=5/.

This is something you can do once off with process substituion:

./program <(sed "/^number=/s/=.*/=5/" baseinput.ini) 

Or you can create a new ini file based on the old one, as in

sed "/^number=/s/=.*/=5/" baseinput.ini > input.ini
./program input.ini

You could also define the entire ini file the script, and substitute in a here document:

N=5
./program - << EOF
[Section]
number=$N
foo=bar
EOF

Upvotes: 3

suspectus
suspectus

Reputation: 17288

Not quite sure whether this helps or not: This calls the program script five times:

for n in 1 2 3 4 5
do
   ./program $n input.ini
done

Then in program, refer to the first parameter $n as $1.

The second parameter input.ini is $2.

Upvotes: 0

Related Questions