Как исправить двойные / одинарные кавычки внутри кавычек в MySQL 8 с BASH с EOF? - PullRequest
0 голосов
/ 08 октября 2018

Как исправить эту ошибку:

 # 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?

1 Ответ

0 голосов
/ 08 октября 2018

Здесь вам не нужны обратные слеши.Вы путаете командную строку для вашего heredoc и наоборот.Вы также путаете mysql и командную строку.Каждый из них (командная строка, heredoc и mysql) имеет разные правила, касающиеся одинарных и двойных кавычек.

  1. Mysql требует, чтобы ваши строковые литералы были заключены в одинарные кавычки (но могут также принимать двойные кавычки, но это не такstandardish).
  2. bash, очевидно, имеет свои правила, касающиеся одинарных и двойных кавычек, но они здесь не применяются, так как это - heredoc
  3. Ваш heredoc не волнует.Вещи внутри вашего heredoc обрабатываются как файл.Одинарные кавычки, двойные кавычки, что угодно.Круто то, что bash по-прежнему меняет переменные, поэтому это похоже на SUPERFILE, но это просто наследственность.

Что-то вроде следующего должно работать нормально:

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 счастлив, потому что ваши строковые литералы правильно заключены в кавычки.

Наконец, если вы действительно привязаны к этим двойным кавычкам, вы можете использовать их вместо этого внутри своего heredoc, и это не будет иметь значения.bash проигнорирует их, а mysql пропустит их.

Я солгал, еще одна последняя вещь.Вы можете использовать <<- при объявлении вашего heredoc, чтобы вы могли предшествовать строкам вашего 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
...