Bash脚本读取CSV通过--eval插入Mongo报SyntaxError问题求助
问题根因
你遇到的两个报错均为Bash变量拼接逻辑与Mongo Shell语法冲突导致:
- 新增dob字段后报引号未终止:你的CSV中dob字段值大概率包含双引号、单引号或其他特殊字符,直接拼接进eval参数后打断了Mongo JS的字符串语法结构
- 修改引号后报
user X is not defined:修改引号逻辑后,原本应该作为字符串的变量值没有被双引号包裹,Mongo Shell将其识别为未定义的变量触发报错 - 插入
$userName字面量的问题:变量放在单引号包裹的eval参数内时,Bash不会解析变量,会直接将变量名作为字符串写入MongoDB
修正后的完整脚本
#!/bin/bash # 统一配置数据库名和集合名,切换性别/环境时修改更方便 DB_NAME="USERNAME_a5" # 处理女性数据时改为USERNAME_female_a5即可 COLLECTION_NAME="USERNAME_male_a5" while IFS=, read -r userName firstName lastName gender dob language bloodType zodiac constellation planet genre dino; do mongo "$DB_NAME" --eval "db.$COLLECTION_NAME.insert({ username: \"$userName\", first: \"$firstName\", last: \"$lastName\", gender: \"$gender\", dob: \"$dob\", language: \"$language\", blood_type: \"$bloodType\", zodiac: \"$zodiac\", constellations: \"$constellation\", planets: \"$planet\", tv_genre: \"$genre\", dino: \"$dino\" })" done < males1.csv
额外优化建议
- 如果CSV字段值本身包含双引号,需要先预处理CSV,把值内的双引号替换为转义后的
\",避免仍出现语法报错 - 批量插入数据时可以把所有记录拼接为数组,调用
insertMany一次性插入,不需要循环逐条执行,性能提升明显 - 如果CSV字段存在空值,可以加逻辑判断后再插入,避免插入空字符串
内容的提问来源于stack exchange,提问作者Allen
相关产品推荐
相关产品推荐

