Использование переменных в скрипте bash для установки значений ini-файла при выполнении

Я новичок в bash-скриптинге, но пока не нашел ответа на следующую проблему. Я надеюсь, что кто-нибудь может либо сказать мне, либо дать мне советы о том, как это сделать.

Предыстория: у меня есть программа (скажем, "программа"), которая принимает ini-файл (скажем, "input.ini") как ввод, требующий времени для выполнения. Например, переменная в ini-файле для программы может иметь значение "число", которое может быть установлено в число =1.

Проблема: мне приходится часто звонить./program input.ini, но с разными значениями для "числа", скажем, 1,2,3,4,5. Я подумал, что мог бы написать bash-скрипт, выполняющий программу в цикле установки "число" соответственно. Цикл не является проблемой, но установка "число" в INI-файл. (Я попытался, например, число =$VALUE в INI-файл с VALUE, установленным в сценарии, но это не работает.)

Вопрос: Как мне установить переменную в ini-файле, используя bash-скрипт? (Это не обязательно должно быть постоянно, а только для этого запуска программы.)

Дополнительный вопрос: установка переменной в ini-файле - это одно. Кроме того, было бы здорово сделать следующее (я думал, что это может работать аналогично...): Программа создает некоторые выходные файлы. Имена этих файлов также могут быть установлены в ini-файле, скажем, через "output_name=filename.out". Было бы замечательно, если бы существовало что-то вроде "output_name=filename_$VALUE.out" для соответствующей установки выходных имен.

Я надеюсь, что все ясно, что я пытаюсь сделать, и я был бы очень признателен, если бы у кого-нибудь было решение или подсказки, как это сделать.

Спасибо кари

4 ответа

Решение

Если у вас есть файл, который содержит number=something, вы можете заменить "что-то" на "5", используя sed "/^number=/s/=.*/=5/,

Это то, что вы можете сделать раз с заменой процесса:

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

Или вы можете создать новый INI-файл на основе старого, как в

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

Вы также можете определить весь INI-файл сценария и заменить его здесь документом:

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

Полностью разобрать и установить INI-файл (раздел, ключ, значение) и сохранить в корне.

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

Если у вас есть 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

Не совсем уверен, помогает ли это или нет: это вызывает скрипт программы пять раз:

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

Затем в программе обратитесь к первому параметру $n как $1.

Второй параметр input.ini - это $2.

Другие вопросы по тегам