Shell脚本循环中交互式提示逻辑异常,MySQL配置批量修改需求排查与修正
Shell脚本循环中交互式提示逻辑异常,MySQL配置批量修改需求排查与修正
你遇到的核心问题是嵌套循环的逻辑错误——原本应该让testing.txt里的配置键和diff.txt里的键值对一一对应,但你现在的脚本把每个diff项和所有testing项做了全排列组合,所以才会出现混乱的提示内容。咱们一步步来梳理修正:
问题根源分析
你的脚本里,在遍历diff.txt的每一行(每个完整的键值对)时,又嵌套遍历了testing.txt的所有行(所有配置键),这就导致每一个键值对都会和所有配置键配对,生成了4条提示而不是预期的2条。而且你每次循环都重新生成testing.txt,也是冗余操作。
修正后的脚本实现
我们可以直接从diff.txt里拆分出配置键和对应的值,让它们一一匹配,再结合服务器名生成正确的交互式提示:
#!/bin/bash # 定义交互式询问函数,确保输入合法 ask() { local question="$1" local reply while true; do read -p "$question [yes/no] " reply case "$reply" in yes|no) break ;; *) echo "请输入合法的yes/no选项" ;; esac done echo "$reply" } # 读取服务器列表,逐个处理 while read -r server; do # 读取diff.txt的每一行,用等号拆分键和值 while IFS='=' read -r key value; do # 生成符合需求的提示语句 prompt="Do you want to comment env($key) and add ($key=$value) in server($server) after verifying?" reply=$(ask "$prompt") if [ "$reply" = "yes" ]; then # 注释目标配置文件中的原配置项 sed -i "s/^${key}/#&/" target_my.cnf # 在注释的配置项下方添加新的键值对 sed -i "/^#${key}/a ${key}=${value}" target_my.cnf echo "已完成$key的修改操作" else echo "跳过$key的修改操作" fi done < diff.txt done < server.txt
关键修正点说明
- 取消冗余嵌套循环:直接通过
IFS='='从diff.txt中拆分键和值,完全不需要单独维护testing.txt(它的内容就是diff.txt里的键) - 键值对一一绑定:每读取一行
diff.txt就处理一个配置项,确保提示里的键和对应值完全匹配 - 优化输入验证:用
case语句替代简单的if判断,更优雅地处理非法输入 - 简化sed操作:直接用拆分出的
key变量操作配置文件,避免之前var1变量带来的混乱
额外实用建议
- 执行脚本前务必备份目标配置文件:
cp target_my.cnf target_my.cnf.bak,防止误操作导致配置丢失 - 如果
diff.txt存在空行,可以先过滤再处理:grep -v '^$' diff.txt | while IFS='=' read -r key value; do ...
备注:内容来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

