You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修正点说明

  1. 取消冗余嵌套循环:直接通过IFS='='从diff.txt中拆分键和值,完全不需要单独维护testing.txt(它的内容就是diff.txt里的键)
  2. 键值对一一绑定:每读取一行diff.txt就处理一个配置项,确保提示里的键和对应值完全匹配
  3. 优化输入验证:用case语句替代简单的if判断,更优雅地处理非法输入
  4. 简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 15:48:15