1

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

4 Answers 4

3

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
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you. This solved my problem! What I did is the following: In the newly created baseinput.ini, I have: output_name=filename_$VALUE.out number=value \n /n In my script file, I have: $NUMBER=1 sed "s/value/$NUMBER/" baseinput.ini > input.ini ./program input.ini Hence, both the question as well as the additional question are answered!
Also look at crudini for more robust/simple interactions with ini files from the command line: pixelbeat.org/programs/crudini
1

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_'

Comments

0

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.

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.