如何同时遍历Bash双数组?MongoDB备份脚本变量注入异常排查
MongoDB多库备份脚本变量注入问题排查
以下是常见的几个问题点及解决方式:
1. 数组遍历索引不匹配
如果脚本同时维护了数据库名、备份文件名、Mongo-URI三个数组,普通的for each遍历会导致变量错位,必须按索引对应遍历:
# 正确的索引遍历方式 dbs=("db_shop" "db_log" "db_user") backup_names=("shop_20240520" "log_20240520" "user_20240520") mongo_uris=("mongodb://admin:pass@127.0.0.1:27017/db_shop?authSource=admin" "mongodb://admin:pass@127.0.0.1:27017/db_log?authSource=admin" "mongodb://admin:pass@127.0.0.1:27017/db_user?authSource=admin") # 按数组索引遍历,确保三个数组的元素一一对应 for idx in "${!dbs[@]}"; do target_db="${dbs[$idx]}" backup_path="./backups/${backup_names[$idx]}" target_uri="${mongo_uris[$idx]}" # 执行备份 mongodump --uri="$target_uri" --db="$target_db" --out="$backup_path" done
2. 变量引用未加双引号
如果数据库名、备份路径或URI包含空格、$、&等特殊字符,未加双引号会被Bash拆分解析,导致拼接错误:
# 错误示例:未加引号,特殊字符会被截断或解析 mongodump --uri=$target_uri --db=$target_db --out=$backup_path # 正确写法:所有变量引用加双引号 mongodump --uri="$target_uri" --db="$target_db" --out="$backup_path"
3. Mongo-URI格式错误
连接超时大概率是URI格式问题,需检查:
- 是否包含正确的认证信息(用户名、密码)
- 是否指定了正确的端口与数据库名
- 若使用管理员账号认证,需添加
?authSource=admin参数 - 避免URI里出现未转义的特殊字符(比如密码里的
@、:需要用URL编码转义)
4. 数组定义错误
如果数组元素包含空格或特殊字符,未加双引号会被拆分成多个元素:
# 错误示例:带空格的元素被拆分 dbs=(my shop db log) # 被解析为4个元素:my、shop、db、log # 正确写法:带特殊字符的元素用双引号包裹 dbs=("my shop" "db log")
内容的提问来源于stack exchange,提问作者Golide
相关产品推荐
相关产品推荐

