MySQL CLIでDROP USER IF EXISTS構文エラーが発生しました。

MySQL CLIでDROP USER IF EXISTS構文エラーが発生しました。

私はEditLineラッパーを使用してBashとMySQL Ver 14.14 Distrib 5.7.21とLinux(x86_64)でUbuntu 16.04を使用しています。

コマンドラインから直接Webアプリ(WordPress)用のDBスタックを作成しようとしています。

次のMySQL CLIコードを実行してみました。ここで、特権を持つフル特権ユーザーと同じ名前のデータベースインスタンスを作成しました。

cat <<-EOF | mysql -u root -p"$dbrootp_1"
    DROP USER IF EXISTS "$domain"@"localhost";
    DROP DATABASE IF EXISTS "$domain";
    CREATE USER "$domain"@"localhost" IDENTIFIED BY "$dbuserp_1";
    CREATE DATABASE "$domain";
    GRANT ALL PRIVILEGES ON "$domain".* TO "$domain"@"localhost";
EOF

実行すると、次のエラーが出力されます。

行2のエラー1064(42000):SQL構文にエラーがあります。

行1 "example.com"の近くで使用する正しい構文については、MySQL Serverバージョンのドキュメントを確認してください。

このエラーについて混乱しています。問題は行1にありますか、それとも2にありますか?ここで構文エラーは何ですか?変数拡張を使用する必要があります。

回答に基づいて更新

ユーザーl0b0、私が示した${x}代替案を試しましたが、"$x"残念ながら次のエラーが出力されます。

行1のエラー1064(42000):SQL構文が正しくありません。 1行目の「-law.co.il@localhost」の近くで使用する正しい構文については、MySQL Serverのバージョンマニュアルを確認してください。

mysqlにデータをパイピングせずにCatを出力する:

DROP USER IF EXISTS example.com@localhost;
DROP DATABASE IF EXISTS example.com;
CREATE USER example.com@localhost IDENTIFIED BY MYPASSWORD;
CREATE DATABASE example.com;
GRANT ALL PRIVILEGES ON example.com.* TO example.com@localhost;

答え1

@jordanmが指摘したように、ここにファイル引用は文法ではなく文字通りです。だからあなたが望む

mysql -u root -p"$dbrootp_1" <<-EOF
    DROP USER IF EXISTS ${domain}@localhost;
    DROP DATABASE IF EXISTS ${domain};
    CREATE USER ${domain}@localhost IDENTIFIED BY ${dbuserp_1};
    CREATE DATABASE ${domain};
    GRANT ALL PRIVILEGES ON ${domain}.* TO ${domain}@localhost;
EOF

$domainまたは、特殊文字が含まれている場合は、$dbuserp_1その文字を引用符で囲む必要があります。バックティック:

mysql -u root -p"$dbrootp_1" <<-EOF
    DROP USER IF EXISTS \`${domain}\`@localhost;
    DROP DATABASE IF EXISTS \`${domain}\`;
    CREATE USER \`${domain}\`@localhost IDENTIFIED BY \`${dbuserp_1}\`;
    CREATE DATABASE `${domain}`;
    GRANT ALL PRIVILEGES ON \`${domain}\`.* TO \`${domain}\`@localhost;
EOF

関連情報