Здесь вам не нужны обратные слеши.Вы путаете командную строку для вашего heredoc и наоборот.Вы также путаете mysql и командную строку.Каждый из них (командная строка, heredoc и mysql) имеет разные правила, касающиеся одинарных и двойных кавычек.
- Mysql требует, чтобы ваши строковые литералы были заключены в одинарные кавычки (но могут также принимать двойные кавычки, но это не такstandardish).
- bash, очевидно, имеет свои правила, касающиеся одинарных и двойных кавычек, но они здесь не применяются, так как это - heredoc
- Ваш 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