Как улучшить мою логику для чтения и записи значений переменных в файл? - PullRequest
2 голосов
/ 18 февраля 2011

Я написал функции в сценарии оболочки для чтения и записи переменных параметров из / в файл. Мне интересно, есть ли более чистый способ сделать это. Мне особенно не нравится бит, в котором я удаляю существующее совпадение для записи, а затем переписываю в конце файла. Есть лучший способ сделать это? Спасибо.

fnReadTestSetting()
{
#$1 is the variable to be read from the testsettings.ini file
grep $1 $MAIN_FOLDER/testsettings.ini >$MAIN_FOLDER/temp.ini
if [ $? -eq 0 ]; then
    sed -i "s|$1=||" $MAIN_FOLDER/temp.ini
    TEST_VALUE=`cat $MAIN_FOLDER/temp.ini`
    export $1=$TEST_VALUE
fi
rm $MAIN_FOLDER/temp.ini
return
}


fnWriteTestSetting()
{
#$1 is the variable and value to be written to the testsettings.ini file in the format VARIABLE_NAME=VALUE
if [ ! -e $MAIN_FOLDER/testsettings.ini ]; then
    touch $MAIN_FOLDER/testsettings.ini
fi
SETTING_NAME=`echo $1 | awk -F = '{print $1}'`
grep $SETTING_NAME $MAIN_FOLDER/testsettings.ini &>/dev/null
if [ $? -eq 0 ]; then
    sed -i "/^$SETTING_NAME/d" $MAIN_FOLDER/testsettings.ini
    echo "$1" >> $MAIN_FOLDER/testsettings.ini

else
    echo "$1" >> $MAIN_FOLDER/testsettings.ini
fi
return
}

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Я сделал несколько улучшений:

Вы можете использовать один sed для чтения настроек.Это сохраняет запись в файл tmp.Не уверен, почему вы пытались экспортировать $ 1.

fnReadTestSetting()
{
  #$1 is the variable to be read from the testsettings.ini file
  sed -n "s/^$1=\(.*$\)/\1/p" $MAIN_FOLDER/testsettings.ini 
}

Для записи вам не нужно прикасаться к файлу, если он не существует, потому что он все равно будет создан.Вам не нужен awk для поиска имени настройки.Вы также можете поместить grep в качестве условия в свой оператор if вместо явной проверки его кода выхода.Для замены используйте один sed (вместо удаления и повторения).

fnWriteTestSetting()
{
  #$1 is the variable and value to be written to the testsettings.ini file in the format VARIABLE_NAME=VALUE
  SETTING_NAME=${1%%=*}
  if grep -sq "^${SETTING_NAME}=" $MAIN_FOLDER/testsettings.ini
  then
    sed -i "s/^${SETTING_NAME}=.*$/$1/" $MAIN_FOLDER/testsettings.ini
  else
    echo "$1" >> $MAIN_FOLDER/testsettings.ini
  fi
  return
}

Обновление:

%%=* удаляет все после =.Для получения дополнительной информации об операторе %% обратитесь к руководству по работе со строками :

${string%%substring} Удаляет самое длинное совпадение $ substring из задней части $ string.

0 голосов
/ 18 февраля 2011

На самом деле нет необходимости использовать sed -i для временного файла, так как вы можете просто использовать sed для возврата строки, которую вы устанавливаете в переменную, в любом случае. Кроме того, я не верю, что ваше регулярное выражение учитывает пространство по обе стороны от знака равенства, что часто допускается в файлах .ini (http://en.wikipedia.org/wiki/INI_file). Регулярное выражение по-прежнему довольно чисто, и запись во временные файлы намного чище, так как делает функцию чтения не имеющей побочных эффектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...