首页 > 解决方案 > MySQL bash语句中的特殊字符导致失败

问题描述

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

使用以下失败:

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 之类的脚本语言来做这件事

标签: bashspecial-characters

解决方案


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

1234cd srcABC^@DEFGH

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

shell中有很多特殊字符会在双引号字符串中引起各种扩展效果。

你可以阅读man bash

执行的扩展有七种:大括号扩展、波浪号扩展、参数和变量扩展、命令替换、算术扩展、分词和路径名扩展。

扩展的顺序是:大括号扩展、波浪号扩展、参数、变量和算术扩展以及命令替换(以从左到右的方式完成)、分词和路径名扩展。

在可以支持它的系统上,还有一个额外的扩展可用:进程替换。

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


推荐阅读