读取CSV批量创建MariaDB用户的Shell脚本运行异常排查
故障原因
你的脚本存在以下几个直接导致运行失败的问题:
- 分隔符配置错误:CSV默认用逗号分隔字段,你在读取时把
IFS设置为冒号:,根本无法正确拆分每一列的内容 - 比较语法错误:
(( ))是Shell专门做算术运算的语法,不能用来做字符串相等判断,判断性别字段值用这个语法会直接报错 - 逻辑不全:你只写了男性用户的处理分支,完全没实现女性用户用
continent字段作为密码的需求 - MySQL语句语法风险:SQL语句里的用户名、密码、字符串值都没有加引号,只要字段值带空格、特殊字符就会执行失败
- 基础逻辑疏漏:定义了
FILENAME变量但没有把文件传入读取循环,也没有跳过CSV第一行的表头,会把表头行当成用户数据执行 - 版本兼容性问题:MariaDB 10.4及以上版本不再支持直接在
GRANT语句里用IDENTIFIED BY创建用户,必须先创建用户再单独授权
修复后的完整脚本
#!/bin/bash # 填写有CREATE USER、GRANT权限的数据库管理员账号信息 DB_ADMIN="root" DB_ADMIN_PWD="你的数据库管理员密码" CSV_FILE="mgarr048.csv" # 跳过CSV第一行表头,逐行读取用户数据 tail -n +2 "$CSV_FILE" | while IFS=',' read -r username first last gender dob state municipality season continent elective f1 airline do # 跳过空行 [ -z "$username" ] && { echo "检测到空行,跳过"; continue; } # 按规则匹配用户密码 case "$gender" in "m") user_pwd="$airline" ;; "f") user_pwd="$continent" ;; *) echo "用户 $username 性别字段值无效,跳过创建"; continue ;; esac # 执行用户创建和授权操作 mysql -u"$DB_ADMIN" -p"$DB_ADMIN_PWD" -e " CREATE USER IF NOT EXISTS '$username'@'%' IDENTIFIED BY '$user_pwd'; GRANT INSERT ON *.* TO '$username'@'%'; FLUSH PRIVILEGES; " [ $? -eq 0 ] && echo "用户 $username 创建成功,密码已按规则设置" || echo "用户 $username 创建失败" done
使用前注意事项
- 先把脚本里的
DB_ADMIN、DB_ADMIN_PWD替换为你实际的数据库管理员账号和密码 - 给脚本添加执行权限:
chmod +x create_users.sh(替换成你实际的脚本文件名) - 如果CSV文件是在Windows下编辑生成的,先执行
sed -i 's/\r$//' mgarr048.csv去除Windows换行符,否则会出现字段读取带多余字符的问题 - 如果数据库开启了密码强度校验,请提前确认生成的密码符合复杂度要求,否则会创建用户失败
内容的提问来源于stack exchange,提问作者Michael Garrido
相关产品推荐
相关产品推荐

