bash - 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 之类的脚本语言来做这件事
解决方案
这是一个外壳问题。在您显示的示例中,字符!!
在发送到 mysql 客户端之前由 shell 历史扩展处理。所以你正在设置密码:
1234cd srcABC^@DEFGH
假设cd src
是您在此之前运行的命令。!!
替换为您的 shell 历史记录中的上一个命令。
shell中有很多特殊字符会在双引号字符串中引起各种扩展效果。
你可以阅读man bash
:
执行的扩展有七种:大括号扩展、波浪号扩展、参数和变量扩展、命令替换、算术扩展、分词和路径名扩展。
扩展的顺序是:大括号扩展、波浪号扩展、参数、变量和算术扩展以及命令替换(以从左到右的方式完成)、分词和路径名扩展。
在可以支持它的系统上,还有一个额外的扩展可用:进程替换。
要掌握 shell 编程,您基本上需要研究所有这些并了解哪些在不同类型的引号中起作用。
推荐阅读
- reactjs - 如何在react js中由highchart绘制的折线图中获取选定的年份范围
- python - 在列名中使用日期时出现 Pandas KeyError
- visual-studio-code - 将视觉工作室重置为默认设置
- fonts - 如何在堆栈溢出的注释部分中发布代码片段
- c++ - 使用 librdkafka 在 kafka 生产者中将结构作为输入而不是字符串
- javascript - 本地存储“删除”按钮不起作用
- algorithm - 网络流中的单个最小割
- reactjs - 尝试构建时反应本机 IOS 应用程序抛出错误
- html - 将 PSD 切片为 HTML 以获得更多分辨率
- websphere-mq-fte - MFT 传输后的存档文件