Проблема в том, что обратные кавычки в SQL рассматриваются оболочкой как подстановки команд. Оболочка попытается запустить строку с обратной галочкой как команду, чтобы заменить этот бит выводом этой конкретной команды.
Оболочка делает это, потому что вы 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"
... предполагая, что конкретная база данных, которую вы используете, может обрабатывать данные полей с двойными кавычками.