目录
一、shell脚本内容
# 更新ini配置文件指定section指定key的value
function set_ini() {
# key和value的分隔符,即等号两边有没有空格
#delimeter='='
delimeter=' = '
file=$1
section=$2
key=$3
val=$4
# 使用awk从INI文件中提取指定section和key的值
keyvalue=$(awk -F ' = ' '/\['$section'\]/{a=1} (a==1 && $1=="'$key'"){print $2; exit}' $file)
# 检查提取到的值是否为空
if [ -z "$keyvalue" ]; then
echo "WARN: $file"
echo "Value for key '$key' in section '$section' is empty."
return 1
else
#使用awk命令更新INI文件中的指定section和key的值
awk -F "$delimeter" '/\['${section}'\]/{a=1} (a==1 && "'${key}'"==$1){gsub($2,"'${val}'");a=0} {print $0}' ${file} 1<>${file}
fi
# 示例用法
# set_ini $file $section $key $value
}
二、示例
1.假设现在我有这样一个demo.ini文件,文件内容为
[section1]
key1 = value1
key2 = value2
[section2]
key1 = value3
2.当我需要用shell脚本修改内容时,可以调用set_ini方法,例如
# 示例用法
# set_ini $file $section $key $value
new_value=test
set_ini demo.ini section2 key1 $new_value
上述的意思为:将demo.ini中section2下key1的值替换为新的值new_value,这样demo.ini文件的内容将会修改为
[section1]
key1 = value1
key2 = value2
[section2]
key1 = test
三、脚本解析
awk -F "$delimeter" '/\['${section}'\]/{a=1} (a==1 && "'${key}'"==$1){gsub($2,"'${val}'");a=0} {print $0}' ${file} 1<>${file}
该行代码的功能是在给定的INI文件中搜索指定的section和key,并替换其对应的value。具体解释如下:
-F "$delimeter"
:此参数定义了字段分隔符,即等号两边的空格。'/\['${section}'\]/
:这是一个正则表达式,用于匹配包含指定section的行。${section}
是替换为实际section值之前的变量。{a=1}
:当匹配到符合section的行时,将变量a设置为1。(a==1 && "${key}"==$1)
:这是一个条件,检查当前行是否包含指定的key。${key}
是替换为实际key值之前的变量。{gsub($2,"${val}");a=0}
:如果上述条件满足,则使用gsub
函数替换key对应value的值。${val}
是替换为实际value值之前的变量。之后将a设为0,表示已经找到并替换了key的值。{print $0}
:无论是否找到并替换了key的值,都将打印整行。${file}
:这是要处理的INI文件的路径,同样,${file}
是替换为实际文件路径之前的变量。1<>${file}
:这是一个重定向操作,将输出写入到同一个文件中,而不是标准输出。这样可以原地修改文件内容,而不是创建一个新的输出文件。
gsub
函数的基本语法
string_var=$(echo "$string_var" | gsub "old_pattern" "new_pattern")
其中,string_var
是要进行替换操作的字符串变量,old_pattern
是要被替换的旧模式,new_pattern
是替换后的新模式。