Использование переменных в скрипте 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.