使用bash脚本中的变量在执行时设置ini文件值

时间:2013-07-30 20:54:03

标签: bash shell ini

我是新手来编写脚本,但尚未找到以下问题的答案。我希望有人可以告诉我或者给我一些如何做的提示。

背景:我有一个程序(说"程序")接受一个ini文件(比如" input.ini")作为输入需要一段时间才能执行。程序的ini文件中的变量可能是" number"例如,可能设置为number = 1。

问题:我必须经常调用./program input.ini,但是" number"的值不同,比如说1,2,3,4,5。 我想,我可以编写一个bash脚本,在for循环设置中执行该程序" number"因此。循环不是问题,而是设置" number"在ini文件中。 (我在ini文件中尝试了例如number = $ VALUE,并在脚本中设置了VALUE,但这不起作用。)

问题:如何使用bash脚本在ini文件中设置变量? (这不一定是永久性的,但仅适用于该程序的运行。)

附加问题:在ini文件中设置变量是一回事。另外,做以下事情也很棒(我认为可能类似......):程序产生一些输出文件。这些文件的名称也可以在ini文件中设置,例如通过" output_name = filename.out"。如果有类似" output_name = filename_ $ VALUE.out"那么现在会很棒。相应地设置输出名称。

我希望很清楚我尝试做什么,如果有人有解决方案或提示如何做,我会非常感激。

谢谢, 卡里

4 个答案:

答案 0 :(得分:3)

如果您的文件包含number=something,则可以使用sed "/^number=/s/=.*/=5/将“内容”替换为“5”。

这是你可以用过程替代做一次的事情:

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

或者您可以根据旧文件创建新的ini文件,如

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

您还可以在脚本中定义整个ini文件,并在here文档中替换:

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

答案 1 :(得分:1)

完整解析并设置ini文件(section,key,value)并保存在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_'

答案 2 :(得分:0)

不确定这是否有帮助: 这会调用程序脚本五次:

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

然后在程序中,将第一个参数$ n称为$ 1。

第二个参数input.ini是$ 2.

答案 3 :(得分:0)

如果您有可用的git并且您不担心缩进,那么黑客可能就是使用git config。

示例:

$ 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