shell脚本修改.ini文件指定section下指定key的value值

目录

一、shell脚本内容

二、示例

三、脚本解析


一、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是替换后的新模式。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值