Bash 如何改进向文件中读取和写入变量值的逻辑?

Bash 如何改进向文件中读取和写入变量值的逻辑?,bash,file,shell,variables,Bash,File,Shell,Variables,我在shell脚本中编写函数,以便从/向文件读取和写入变量设置。我想知道是否有更干净的方法来做这件事。我特别不喜欢删除现有匹配项进行写入,然后在文件末尾重写。有更好的方法吗?谢谢 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

我在shell脚本中编写函数,以便从/向文件读取和写入变量设置。我想知道是否有更干净的方法来做这件事。我特别不喜欢删除现有匹配项进行写入,然后在文件末尾重写。有更好的方法吗?谢谢

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
}

实际上没有必要在临时文件上使用
sed-i
,因为您可以使用sed将要设置的字符串返回给变量。另外,我不相信您的正则表达式会占用等号两边的空间,这在.ini文件()中通常是允许的。正则表达式仍然非常干净,不写入临时文件更干净,因为它使读取函数没有副作用。

我做了一些改进:

可以使用单个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进行替换(而不是删除和回显)

更新:

%%=*
删除
=
之后的所有内容。有关
%%
运算符的更多信息,请查看:

${string%%substring}
删除最长的 从后面匹配$substring $string


您可能希望使用
${string#substring}
$string
前面去除
$substring
的最短匹配,而不是生成
awk
来去除
变量=
位;这里有一些小细节:我尝试了以下内容:LINE=
grep$1 testsettings.ini
;密钥=$1“=”;值=${LINE#$KEY};出口1美元=美元价值;但当我将IP传递给函数时失败,该函数的值IP_ADDRESS=10.0.0.1写入testsettings。在某些问题1)sed返回退出状态0,无论是否与$1匹配。您认为有没有更好的方法来检查文件中是否定义了变量,而不必为文件中的“variable=”进行灰显?2) 你能解释一下设置_NAME=${1%%=*}是如何工作的吗?以前从没见过这个。谢谢。我不知道它的用途,但是
导出
设置变量名的值,该值保存在
$1
declare
无法使用,因为这会使变量成为函数的局部变量,
eval
具有安全风险,如您所知<代码>a=':;pwd;:';eval$a=foo评估
pwd
(可能是恶意的)<代码>声明和导出会产生错误,因此更安全。刚刚发布的bash4.2具有
declare-g
,用于在函数中声明全局变量。我以前没见过这个
导出
的把戏。一个副作用是,在某些情况下,出口可能是不可取的。
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
}