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