gpt4 book ai didi

mysql - 如何使用 BASH 和 EOF 修复 MySQL 8 中引号内的双/单引号?

转载 作者:行者123 更新时间:2023-11-29 06:38:35 25 4
gpt4 key购买 nike

如何修复此错误:

 # cat <<EOF | mysql -uroot -p${MYSQL_PASSWD}
> create database zabbix character set utf8 collate utf8_bin; create user zabbix@localhost identified by '${ZABBIX_PASSWD}';
> grant all privileges on zabbix.* to '\'zabbix'\'@'\'localhost'\' identified by '${ZABBIX_PASSWD}';
> flush privileges;
> exit
> EOF
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR at line 2: Unknown command '\''.

或者用双引号:

 # cat <<EOF | mysql -uroot -p${MYSQL_PASSWD}
> create database zabbix character set utf8 collate utf8_bin; create user zabbix@localhost identified by '${ZABBIX_PASSWD}';
> grant all privileges on zabbix.* to "\""zabbix\""@"\"localhost"\"" identified by '${ZABBIX_PASSWD}';
> flush privileges;
> exit
> EOF
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR at line 2: Unknown command '\"'.

没有双引号/单引号:

# cat <<EOF | mysql -uroot -p${MYSQL_PASSWD}
> create database zabbix character set utf8 collate utf8_bin; create user zabbix@localhost identified by '${ZABBIX_PASSWD}';
> grant all privileges on zabbix.* to zabbix@localhost identified by '${ZABBIX_PASSWD}';
> flush privileges;
> exit
> EOF
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by ''' at line 1

或者仅使用双引号/单引号:

# cat <<EOF | mysql -uroot -p${MYSQL_PASSWD}
> create database zabbix character set utf8 collate utf8_bin; create user zabbix@localhost identified by '${ZABBIX_PASSWD}';
> grant all privileges on zabbix.* to "zabbix"@"localhost" identified by '${ZABBIX_PASSWD}';
> flush privileges;
> exit
> EOF
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by ''' at line 1

EOF shell 文件中的错误是否相同?

最佳答案

这里不需要反斜杠。您混淆了定界符的命令行,反之亦然。您还混淆了 mysql 和命令行。其中每一个(命令行、heredoc 和 mysql)对于单引号和双引号都有不同的规则。

  1. Mysql 需要将字符串文字括在单引号中(但也可以使用双引号,但这不是标准的)。
  2. bash 显然有关于单引号和双引号的规则,但它们不适用于此处,因为这是一个定界符
  3. 你的heredoc不在乎。 Heredoc 中的内容被视为文件。单引号、双引号等等。最酷的是 bash 仍然会交换变量,所以它就像一个 super 文件,但它只是一个定界符。

像下面这样的东西应该可以正常工作:

cat <<EOF | mysql -uroot -p${MYSQL_PASSWD}
create database zabbix character set utf8 collate utf8_bin; create user 'zabbix'@'localhost' identified by '${ZABBIX_PASSWD}';
grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by '${ZABBIX_PASSWD}';
flush privileges;
exit
EOF

你的变量将被 bash 替换,即使它们周围有单引号,因为这里文档不关心。然后这一切都被传递到 mysql 中,并且 mysql 很高兴,因为你的字符串文字被正确引用了。

最后,如果您真的很喜欢这些双引号,您可以在定界文档中使用它们,这不会产生任何影响。 bash 将忽略它们,而 mysql 将允许它们通过。

最后一件事我撒了谎。您可以使用<<-当声明你的heredoc时,你可以在heredoc中的行之前添加空格,这样如果你在脚本中执行此操作,则更容易阅读。您还可以将您的定界符命名为您想要的任何名称,只要它以相同的单词结尾即可(这两者都是为了脚本清晰度/可读性)。您也不需要cat这里,因为 mysql 可以直接从文件中使用,并且heredoc几乎在所有重要的方面都是一个文件。

mysql -uroot -p${MYSQL_PASSWD} <<-MYSQLCOMMANDS
create database zabbix character set utf8 collate utf8_bin; create user 'zabbix'@'localhost' identified by '${ZABBIX_PASSWD}';
grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by '${ZABBIX_PASSWD}';
flush privileges;
exit
MYSQLCOMMANDS

关于mysql - 如何使用 BASH 和 EOF 修复 MySQL 8 中引号内的双/单引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52707714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com