1
mysql -u root -p"$MYSQL_ROOT_PASS" -e "CREATE DATABASE IF NOT EXISTS $MYSQL_DB; GRANT ALL PRIVILEGES ON  $MYSQL_DB.* TO $MYSQL_DB@localhost;"

次のエラーを出力します。

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-simple' at line 1

データベース名はlosk_net-simple_ru

4

1 に答える 1

2

データベース名にはハイフンが含まれているため-、バッククォートで囲む必要があります。二重引用符で囲まれた Bash 文字列内でこれを正常に行うには、展開のために変数を囲むために、バッククォートをバックスラッシュでエスケープする必要があります。

後で、変数$MYSQL_DBをユーザー名として再利用します。そのコンテキストでは、のような文字列として単一引用符で囲む必要があります'$MYSQL_DB'

mysql -u root -p"$MYSQL_ROOT_PASS" -e "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DB\`; GRANT ALL PRIVILEGES ON \`$MYSQL_DB\`.* TO '$MYSQL_DB'@localhost;"
#------------------------------------------------------------------^^^^^^^^^^^^^^^^^-------------------------------------------^^^^^^^^^^^^

ただし、この実行をテストすると、次のメッセージが表示されます。

1 行目の ERROR 1470 (HY000): 文字列 'losk_net-simple_ru' はユーザー名に対して長すぎます (16 以内にする必要があります)

したがって、同様のエラーが発生した場合は、データベース名とは異なるユーザー名を選択する必要があります。

MySQL の文字列と識別子で使用される引用符の種類については、この質問を参照してください。これは PHP に関連していますが、そのほとんどはここでも関連しています。

一般に、このような状況では、データベース名にa を含めないことをお勧めし-ます。Bash だけでなく、あらゆるコンテキストで常にバッククォートする必要があります。[0-9,a-z,A-Z$_]将来の頭痛の種を避けるために、一連の for 識別子に固執してください。

于 2013-09-08T14:04:08.310 に答える