![脚本:根据系统用户编写邮箱SQL记录](https://linux22.com/image/144636/%E8%84%9A%E6%9C%AC%EF%BC%9A%E6%A0%B9%E6%8D%AE%E7%B3%BB%E7%BB%9F%E7%94%A8%E6%88%B7%E7%BC%96%E5%86%99%E9%82%AE%E7%AE%B1SQL%E8%AE%B0%E5%BD%95.png)
该命令有问题或者我没有看到我的错误。我还需要排除禁用用户和 UID 超过 500 的用户。这是我需要使用的 SQL 命令
INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `local_part`, `domain`, `created`, `modified`, `active`) VALUES ('$username, '$pass', '', '$xxxx', 0, 'xxx', 'xxx', 'date --rfc-3339=date', 'date --rfc-3339=date', 1);"
答案1
问题在于 SQL 中的反引号被 shell 视为命令替换。 shell 会尝试将反引号字符串作为命令运行,以将该位替换为该特定命令的输出。
shell 这样做是因为您的echo
字符串带有双引号。
要解决这个特定问题,请将每个反引号转义为\`
。
理想情况下,您可以将 SQL 作为单引号字符串传递,但这意味着变量不会扩展。
你也可以这样做,这样会更安全:
printf 'INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `local_part`, `domain`, `created`, `modified`, `active`) VALUES ("%s", "%s", "", "%s", 0, "xxx", "xxx", "date --rfc-3339=date", "date --rfc-3339=date", 1);\n' "$username" "$pass" "$xxxx"
...假设您使用的特定数据库可以处理双引号字段数据。