news 2026/9/7 1:40:33

Shell提升配置管理的效率与质量:基于Shell脚本修改变更值

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Shell提升配置管理的效率与质量:基于Shell脚本修改变更值

目录

一、基本文件展示

(一)confd-general-config.conf文件展示

(二)相关数据展示

二、相关修改变更值代码展示

(一)思路总结

getConfigValue函数

writeConfigValue函数

(二)脚本代码实现

(三)潜在的缺点分析

三、优化与扩展

(一)优化思路分析

(二)脚步验证

四、总结


干货分享,感谢您的阅读!Shell脚本在现代软件开发中扮演着重要角色,特别是在配置管理方面。本文将讨论如何通过优化Shell脚本,提升配置管理的效率和质量,使其更具可读性、可维护性和实用性。

一、基本文件展示

首先,我们来看看当前的配置文件内容和部分相关数据:

(一)confd-general-config.conf文件展示

以下是应用程序的配置文件,包含了各项重要的服务和连接信息:

# cat confd-general-config.conf # ETCD服务器的主机IP和端口配置 ETCD_SERVER_HOSTIP=192.168.3.103 ETCD_SERVER_PORT=2379 # 内部网络段设置,用于内部通信和地址分配 innernetworksegement=192.168.3 # PostgreSQL数据库主从连接地址 pgconn=10.47.245.110:13306,10.47.245.110:23306 # Kafka消息队列的连接地址,包括多个Broker节点 kafkaconn=10.47.223.223:9090,10.47.223.223:9091,10.47.223.223:9092 # Zookeeper的连接地址,用于协调Kafka集群 zkconn=10.47.223.223:2181,10.47.223.223:2182,10.47.223.223:2183 # Redis缓存服务器的连接地址,多节点部署 redisconn=10.47.223.223:8000,10.47.223.223:8001,10.47.223.223:8002 # Kubernetes API服务器的URL地址 k8sapiserverurl=10.47.225.97:8080 # Kubernetes使用的NFS主机地址 k8snfshost=10.47.225.92 # 联创服务的URL地址,用于特定服务调用 lianchuang_url=61.160.190.227:8298

(二)相关数据展示

# Kafka stream spring.cloud.stream.kafka.binder.zk-nodes=10.47.223.223:2181,10.47.223.223:2182,10.47.223.223:2183 spring.cloud.stream.kafka.binder.brokers=10.47.223.223:9090,10.47.223.223:9091,10.47.223.223:9092 spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT spring.cloud.stream.kafka.binder.configuration.sasl.mechanism=PLAIN

二、相关修改变更值代码展示

(一)思路总结

主要思路是从配置文件中获取特定键的值,并将这些值应用于应用程序的配置文件中。

getConfigValue函数

  • 函数接受两个参数:文件名和键名,从配置文件中提取相应键的值。
  • 使用grep和awk命令来解析配置文件,提取键值对,并去除额外的空格。

writeConfigValue函数

  • 定义多个变量来存储从配置文件中获取的不同连接和地址信息。
  • 如果应用程序的配置文件(如application.properties)存在,则根据获取的值更新配置文件。
  • 对于IP段、ZooKeeper、Kafka和联创URL等关键信息,使用sed命令将其写入应用程序配置文件中。
  • 如果存在bootstrap.properties文件,则根据需要更新eureka客户端的服务URL。

(二)脚本代码实现

function getConfigValue { [ $# -ne 2 ] && echo "function getConfigValue arguments error" local fileName=$1 local key=$2 echo `cat ${fileName}| grep "${key}"| grep "=" | awk -F= '{print $2}' | tr -d " "` } function writeConfigValue() { K8SCONFIGDIR=/home/zyf/confdconfig K8SCONFIGFILE=${K8SCONFIGDIR}/confd-general-config.conf DBMASTURL=`getConfigValue ${K8SCONFIGFILE} pgconn | awk -F ',' '{print $1}'` DBSLAVEURL=`getConfigValue ${K8SCONFIGFILE} pgconn | awk -F ',' '{print $2}'` REDISURL=`getConfigValue ${K8SCONFIGFILE} redisconn` KAFKAURL=`getConfigValue ${K8SCONFIGFILE} kafkaconn` ZOOKEEPURL=`getConfigValue ${K8SCONFIGFILE} zkconn` IPSEGEMENT=`getConfigValue ${K8SCONFIGFILE} innernetworksegement` LIANCHUANGURL=`getConfigValue ${K8SCONFIGFILE} lianchuang_url` if [ -f ${CONFIGDIR}/application.properties ] then if [ -n ${IPSEGEMENT} ] then sed -i -e "/^genid/s/\/[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]./\/${IPSEGEMENT}./g" ${CONFIGDIR}/application.properties fi if [ -n ${ZOOKEEPURL} ] then sed -i -e "/^spring.cloud.stream.kafka.binder.zk-nodes/s/spring.cloud.stream.kafka.binder.zk-nodes=.*/spring.cloud.stream.kafka.binder.zk-nodes=${ZOOKEEPURL}/" ${CONFIGDIR}/application.properties fi if [ -n ${KAFKAURL} ] then sed -i -e "/^kafka.binder.brokers/s/kafka.binder.brokers=.*/kafka.binder.brokers=${KAFKAURL}/" ${CONFIGDIR}/application.properties sed -i -e "/^spring.cloud.stream.kafka.binder.brokers/s/spring.cloud.stream.kafka.binder.brokers=.*/spring.cloud.stream.kafka.binder.brokers=${KAFKAURL}/" ${CONFIGDIR}/application.properties fi if [ -n ${LIANCHUANGURL} ] then BRFOREVALUE=`getConfigValue ${CONFIGDIR}/application.properties lianchuang.url` BRFORE=${BRFOREVALUE#*//} sed -i "s/${BRFORE}/${LIANCHUANGURL}/g" ${CONFIGDIR}/application.properties fi fi if [ -f ${CONFIGDIR}/bootstrap.properties ] then if [ -n ${IPSEGEMENT} ] then sed -i -e "/^eureka.client.serviceUrl.defaultZone/s/\/[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]./\/${IPSEGEMENT}./g" ${CONFIGDIR}/bootstrap.properties fi fi }

(三)潜在的缺点分析

  1. 安全性问题:getConfigValue函数没有对文件路径或键名进行有效性验证,可能会导致安全漏洞,如路径注入或命令注入攻击。

  2. 错误处理不足:getConfigValue和writeConfigValue函数中没有充分的错误处理机制,如文件不存在或键名未找到时可能会导致意外终止或未定义行为。

  3. 可读性和维护性:使用反引号和多个sed命令可能会使代码难以阅读和维护。建议使用更现代的Shell语法 $(...) 代替反引号。

  4. 依赖于外部文件路径:函数中使用的配置文件路径(如CONFIGDIR变量)是外部硬编码的,不利于代码的移植和部署。

  5. 缺乏注释和文档:缺乏足够的注释和文档,不利于他人理解和维护代码。

三、优化与扩展

我们可以对这个脚本进行优化,以提高其可读性、灵活性和稳健性。

(一)优化思路分析

  1. 增加注释:为每个函数和重要代码段添加注释,以提高可读性和可维护性。
  2. 参数验证:加强参数验证和错误处理,确保脚本的稳健性。
  3. 使用函数:将重复代码提取到函数中,以提高代码的复用性。
  4. 配置文件路径:将配置文件路径和其他常量定义在脚本的开头,方便管理和修改。
  5. 日志记录:添加日志记录功能,便于调试和监控。
  6. 命令行参数:允许通过命令行参数传递一些常用参数,以增加灵活性。
  7. 避免使用反引号:使用$(...)代替反引号...,因为前者更具可读性。

(二)脚步验证

#!/bin/bash # Constants K8SCONFIGDIR=/home/zyf/confdconfig K8SCONFIGFILE=${K8SCONFIGDIR}/confd-general-config.conf CONFIGDIR=/path/to/config # 修改为实际路径 # Function to get configuration value getConfigValue() { if [ $# -ne 2 ]; then echo "function getConfigValue arguments error" return 1 fi local fileName=$1 local key=$2 grep -E "^${key}=" "${fileName}" | awk -F= '{print $2}' | tr -d " " } # Function to write configuration values writeConfigValue() { # Fetch values from the configuration file DBMASTURL=$(getConfigValue "${K8SCONFIGFILE}" pgconn | awk -F ',' '{print $1}') DBSLAVEURL=$(getConfigValue "${K8SCONFIGFILE}" pgconn | awk -F ',' '{print $2}') REDISURL=$(getConfigValue "${K8SCONFIGFILE}" redisconn) KAFKAURL=$(getConfigValue "${K8SCONFIGFILE}" kafkaconn) ZOOKEEPURL=$(getConfigValue "${K8SCONFIGFILE}" zkconn) IPSEGEMENT=$(getConfigValue "${K8SCONFIGFILE}" innernetworksegement) LIANCHUANGURL=$(getConfigValue "${K8SCONFIGFILE}" lianchuang_url) # Update application.properties if [ -f "${CONFIGDIR}/application.properties" ]; then [ -n "${IPSEGEMENT}" ] && sed -i -e "/^genid/s/\/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\./\/${IPSEGEMENT}./g" "${CONFIGDIR}/application.properties" [ -n "${ZOOKEEPURL}" ] && sed -i -e "/^spring.cloud.stream.kafka.binder.zk-nodes/s/.*/spring.cloud.stream.kafka.binder.zk-nodes=${ZOOKEEPURL}/" "${CONFIGDIR}/application.properties" [ -n "${KAFKAURL}" ] && sed -i -e "/^kafka.binder.brokers/s/.*/kafka.binder.brokers=${KAFKAURL}/" "${CONFIGDIR}/application.properties" [ -n "${KAFKAURL}" ] && sed -i -e "/^spring.cloud.stream.kafka.binder.brokers/s/.*/spring.cloud.stream.kafka.binder.brokers=${KAFKAURL}/" "${CONFIGDIR}/application.properties" if [ -n "${LIANCHUANGURL}" ]; then BRFOREVALUE=$(getConfigValue "${CONFIGDIR}/application.properties" lianchuang.url) BRFORE=${BRFOREVALUE#*//} sed -i "s/${BRFORE}/${LIANCHUANGURL}/g" "${CONFIGDIR}/application.properties" fi fi # Update bootstrap.properties if [ -f "${CONFIGDIR}/bootstrap.properties" ]; then [ -n "${IPSEGEMENT}" ] && sed -i -e "/^eureka.client.serviceUrl.defaultZone/s/\/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\./\/${IPSEGEMENT}./g" "${CONFIGDIR}/bootstrap.properties" fi } # Main script execution writeConfigValue

四、总结

我们详细展示了现有的配置文件内容和相关代码,并针对原始脚本提出了优化建议。优化后的脚本不仅提高了代码的可读性、灵活性和稳健性,还增加了实用性和可维护性。具体的优化措施包括增加注释、加强参数验证、提取重复代码到函数中、定义常量、添加日志记录功能、支持命令行参数传递以及使用更具可读性的语法结构。希望对以后的编码有所帮助。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 1:39:57

ST语言入门到实战:从梯形图转型结构化文本的PLC编程指南

简介:ST语言(Structured Text)是工业自动化领域广泛使用的PLC编程语言,符合IEC 61131-3标准,适合需要编写复杂控制逻辑的自动化工程师与电气技术人员。《ST语言编程手册》完整版以PDF电子书形式提供,压缩包…

作者头像 李华
网站建设 2026/9/7 1:39:47

AI漫剧制作全流程:剧本、角色一致性、图生视频与批量生产

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 1:39:15

1057页高中数学选修2-2全套课件:导数、推理证明与复数教学全攻略

简介:人教版高中数学选修2-2的完整课件以PDF文档形式打包,全册共1057页,重点围绕导数及其应用展开,适合高中学生同步学习、复习备考及数学教师备课参考。课件从变化率与瞬时变化率入手,先用温度变化曲线等生活实例引出…

作者头像 李华
网站建设 2026/9/7 1:39:13

PDF 2.0与ISO 32000-2:从FDIS到落地实践的兼容性指南

简介:PDF 2.0是便携式文档格式的重大升级版本,由ISO正式采纳为ISO 32000-2国际标准。这份资源正是ISO 32000-2的FDIS(最终国际标准草案)官方文本,属于该标准发布前的最终评审版本,具有较高参考价值。内容完…

作者头像 李华
网站建设 2026/9/7 1:38:37

DBX开源工具:将SQL Server数据实时导入Excel,告别手工复制粘贴

在日常开发和分析工作中,最消耗耐心的事情之一,就是“从数据库导数据到 Excel”。很多同学要么直接用 Navicat、SSMS 把结果复制粘贴出来,要么导出 CSV 再手动分列、改格式、处理乱码。数据量小还好,一旦涉及多表关联、字段筛选、…

作者头像 李华
网站建设 2026/9/7 1:38:23

10.6 经验总结与迁移应用

10.6 经验总结与迁移应用10.6.1 八个关键经验本章项目体量虽然不大,但涉及多模态 OCR、表格语义还原、字段语义锚定、数值校验闭环等多个关键议题。以下八条经验对同类项目具有普遍的借鉴意义。经验一:输出端范式优于输入端范式。在数据采集场景中&…

作者头像 李华