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

如何合并两个Bash for循环并精简MySQL导入脚本?

精简MySQL导入脚本的实现方案

你的两段脚本逻辑高度重复,仅文件匹配规则和MySQL主机不同,我们可以通过复用逻辑+数据配对的方式精简代码,以下是几种可行方案:

方案一:使用关联数组合并循环

用关联数组直接绑定「文件匹配模式」和「对应MySQL主机」,逻辑清晰直观:

#!/bin/bash

# 提取重复的数据库参数,方便后续修改
DB_USER="admin"
DB_PASS="123456789"
DB_NAME="Validation"

# 定义文件模式与主机的配对关系
declare -A import_pairs=(
    ["/Users/uttambaral/code/zipcodes/*MYSQL-STANDARD.sql"]="database-1.12345678"
    ["/Users/uttambaral/code/zipcodes/*database-STANDARD.sql"]="database-1.ck1n4yzwola8"
)

# 遍历所有配对
for pattern in "${!import_pairs[@]}"; do
    host="${import_pairs[$pattern]}"
    # 遍历当前模式下的所有SQL文件
    for sql_file in $pattern; do
        # 跳过不存在的文件(避免通配符无匹配时出错)
        [[ -f "$sql_file" ]] || continue
        echo "Importing: $sql_file"
        mysql --host="$host" --user="$DB_USER" --password="$DB_PASS" "$DB_NAME" < "$sql_file"
        echo "Import finished for $sql_file"
    done
done

方案二:使用索引数组遍历配对数据

如果你的Bash版本不支持关联数组(较旧版本),可以用索引数组按「模式、主机」的顺序存储配对:

#!/bin/bash

DB_USER="admin"
DB_PASS="123456789"
DB_NAME="Validation"

# 每两个元素为一组:文件匹配模式、对应主机
import_data=(
    "/Users/uttambaral/code/zipcodes/*MYSQL-STANDARD.sql" "database-1.12345678"
    "/Users/uttambaral/code/zipcodes/*database-STANDARD.sql" "database-1.ck1n4yzwola8"
)

# 步长为2遍历数组,逐个处理配对
for ((i=0; i<${#import_data[@]}; i+=2)); do
    pattern="${import_data[$i]}"
    host="${import_data[$i+1]}"
    for sql_file in $pattern; do
        [[ -f "$sql_file" ]] || continue
        echo "Importing: $sql_file"
        mysql --host="$host" --user="$DB_USER" --password="$DB_PASS" "$DB_NAME" < "$sql_file"
        echo "Import finished for $sql_file"
    done
done

方案三:改用while循环读取配对数据

如果后续需要扩展更多配对,或者想把配对数据单独维护,可以用while read读取数据:

#!/bin/bash

DB_USER="admin"
DB_PASS="123456789"
DB_NAME="Validation"

# 通过here-doc传递配对数据,每行格式为「文件模式 主机地址」
while read -r pattern host; do
    for sql_file in $pattern; do
        [[ -f "$sql_file" ]] || continue
        echo "Importing: $sql_file"
        mysql --host="$host" --user="$DB_USER" --password="$DB_PASS" "$DB_NAME" < "$sql_file"
        echo "Import finished for $sql_file"
    done
done << EOF
/Users/uttambaral/code/zipcodes/*MYSQL-STANDARD.sql database-1.12345678
/Users/uttambaral/code/zipcodes/*database-STANDARD.sql database-1.ck1n4yzwola8
EOF

额外优化点

  • 用变量提取重复的数据库参数,后续修改只需要改一处
  • 添加[[ -f "$sql_file" ]]检查,避免通配符未匹配到文件时执行无效的mysql命令
  • 用双引号包裹变量,防止文件名包含空格等特殊字符时出错

内容的提问来源于stack exchange,提问作者youttam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:01:22