web-dev-qa-db-fra.com

Comment exécuter la commande mysql sur bash?

Le code suivant fonctionne sur la ligne de commande

mysql --user='myusername' --password='mypassword' --database='mydatabase' --execute='DROP DATABASE myusername; 
CREATE DATABASE mydatabase;'

Cependant, cela ne fonctionne pas sur le fichier bash sur l'exécution

#!/bin/bash
user=myusername
password=mypassword
database=mydatabase

mysql --user='$user' --password='$password' --database='$database' --execute='DROP DATABASE $user; CREATE DATABASE $database;'

Je reçois l'erreur suivante:

ERROR 1045 (28000): Accès refusé pour l'utilisateur '$ user' @ 'localhost' (avec mot de passe: YES)

Comment faire en sorte que le fichier bash s'exécute en ligne de commande?

55
johnatasjmo

Utilisez des guillemets doubles lorsque vous utilisez des variables BASH.

mysql --user="$user" --password="$password" --database="$database" --execute="DROP DATABASE $user; CREATE DATABASE $database;"

BASH ne développe pas les variables entre guillemets simples.

96
anubhava

Celui-ci a fonctionné, les guillemets doubles lorsque $ user et $ password sont en dehors des guillemets simples. Citations simples lorsque vous vous trouvez dans une seule déclaration.

mysql --user="$user" --password="$password" --database="$user" --execute='DROP DATABASE '$user'; CREATE DATABASE '$user';'
8
johnatasjmo

J'ai écrit un script Shell qui lit les données du fichier de propriétés, puis exécute le script mysql sur un script Shell. partager cela peut aider les autres.

#!/bin/bash
    PROPERTY_FILE=filename.properties

    function getProperty {
       PROP_KEY=$1
       PROP_VALUE=`cat $PROPERTY_FILE | grep "$PROP_KEY" | cut -d'=' -f2`
       echo $PROP_VALUE
    }

    echo "# Reading property from $PROPERTY_FILE"
    DB_USER=$(getProperty "db.username")
    DB_PASS=$(getProperty "db.password")
    ROOT_LOC=$(getProperty "root.location")
    echo $DB_USER
    echo $DB_PASS
    echo $ROOT_LOC
    echo "Writing on DB ... "
    mysql -u$DB_USER -p$DB_PASS dbname<<EOFMYSQL

    update tablename set tablename.value_ = "$ROOT_LOC" where tablename.name_="Root directory location";
    EOFMYSQL
    echo "Writing root location($ROOT_LOC) is done ... "
    counter=`mysql -u${DB_USER} -p${DB_PASS} dbname -e "select count(*) from tablename where tablename.name_='Root directory location' and tablename.value_ = '$ROOT_LOC';" | grep -v "count"`;

    if [ "$counter" = "1" ]
    then
    echo "ROOT location updated"
    fi
0
flopcoder