MySQL bash 语句中的特殊字符导致失败

Special Characters in MySQL bash statement causing fail

我正在尝试自动创建 MySQL 用户 -- 所以我正在构建一个 bash cron 来动态创建它们。问题是,当我创建它们时,我使用的是随机密码生成,其中可以包含 ^ $ % 等字符..

使用以下失败:

create_database=$(mysql --login-path=local -se "CREATE USER IF NOT EXISTS 'user'@'localhost' IDENTIFIED BY '1234!!ABC^@DEFGH';")

鉴于以下成功:

create_database=$(mysql --login-path=local -se "CREATE USER IF NOT EXISTS 'user'@'localhost' IDENTIFIED BY '1234';")

是 CLI 还是 bash 脚本不喜欢密码,还是 MySQL 不喜欢密码?有解决方法吗?我想用 bash 与 PHP/PERL

这样的脚本语言相比

这是一个 shell 问题。在您显示的示例中,字符 !! 在发送到 mysql 客户端之前由 shell 历史扩展处理。所以你设置的密码是:

1234cd srcABC^@DEFGH

假设 cd src 是您在此命令之前 运行 的命令。 !! 被替换为您 shell 历史记录中的上一个命令。

shell 中有很多特殊字符,导致双引号字符串内部出现各种扩展效果。

你可以阅读man bash:

There are seven kinds of expansion performed: brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, word splitting, and pathname expansion.

The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and pathname expansion.

On systems that can support it, there is an additional expansion available: process substitution.

要掌握 shell 编程,您基本上需要学习所有这些并了解哪些在不同类型的引号中起作用。