如何合并两个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
相关产品推荐
相关产品推荐

