如何在bash脚本中修改配置文件内存储的变量值
Bash脚本修改已引用配置文件的变量值方案
问题原因
source conf.dat 只是将配置文件的内容加载到当前bash进程的内存环境中,后续修改的是内存里的变量副本,不会自动同步写入到磁盘上的原始配置文件,因此需要主动调用文本处理工具完成文件写入操作。
解决方案
方法1:直接使用sed命令修改
sed是bash内置的流文本处理工具,可以直接匹配修改配置文件的对应行:
- GNU/Linux系统用法:
sed -i 's/^variable=.*/variable=2/' conf.dat
- macOS系统用法:
sed -i '' 's/^variable=.*/variable=2/' conf.dat
参数说明:
-i参数表示直接修改原文件内容- 正则规则
^variable=.*表示匹配所有以variable=开头的行,整行替换为新的键值对variable=2
方法2:封装通用配置更新函数
如果需要频繁修改不同配置项,可以封装成通用函数复用:
# 参数说明:$1=配置文件路径 $2=目标变量名 $3=变量新值 update_conf() { local conf_file="$1" local var_name="$2" local new_val="$3" if [ ! -f "$conf_file" ]; then echo "配置文件不存在" return 1 fi # 兼容不同系统的sed语法 if [[ "$OSTYPE" == "darwin"* ]]; then sed -i '' "s#^$var_name=.*#$var_name=$new_val#" "$conf_file" else sed -i "s#^$var_name=.*#$var_name=$new_val#" "$conf_file" fi }
调用示例:
# 将conf.dat中的variable值修改为2 update_conf conf.dat variable 2 # 修改完成后重新加载配置,让当前shell的变量同步更新 source conf.dat
修改后的完整file.sh示例
# 引入更新配置的函数 update_conf() { local conf_file="$1" local var_name="$2" local new_val="$3" if [ ! -f "$conf_file" ]; then echo "配置文件不存在" return 1 fi if [[ "$OSTYPE" == "darwin"* ]]; then sed -i '' "s#^$var_name=.*#$var_name=$new_val#" "$conf_file" else sed -i "s#^$var_name=.*#$var_name=$new_val#" "$conf_file" fi } source conf.dat cat conf.dat echo $variable # 更新配置文件中的变量值 update_conf conf.dat variable 2 # 同步更新当前shell的变量值 source conf.dat cat conf.dat echo $variable
执行后输出如下,可验证修改已同步到配置文件:
variable=1 1 variable=2 2
注意事项
如果变量值包含/、&等sed特殊字符,上面示例中使用#作为sed分隔符的写法已经可以规避大部分冲突场景,无需额外转义。
内容的提问来源于stack exchange,提问作者GeneralCode
相关产品推荐
相关产品推荐

