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 编程,您基本上需要学习所有这些并了解哪些在不同类型的引号中起作用。
我正在尝试自动创建 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 编程,您基本上需要学习所有这些并了解哪些在不同类型的引号中起作用。