J'ai besoin d'une variable pour conserver les résultats extraits de la base de données. Jusqu'à présent, c'est ce que j'essaye sans succès.
myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a)
Ma compréhension des commandes bash n’est pas très bonne, comme vous pouvez le constater.
Je ne connais pas grand chose à propos de l’interface de ligne de commande MySQL, mais en supposant que vous n’ayez besoin que d’aide pour le bashing, vous devriez essayer d’échanger les commandes de la manière suivante:
myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password)
qui fait écho la chaîne dans MySQL. Ou, vous pouvez être plus sophistiqué et utiliser de nouvelles fonctionnalités bash (la chaîne here)
myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a")
aboutissant à la même chose (en supposant que vous utilisez une version assez récente de bash), sans impliquer d’écho.
Notez que le mot de passe -p $ n'est pas une faute de frappe, mais constitue le moyen par lequel MySQL s'attend à ce que les mots de passe soient entrés via la ligne de commande (sans espace entre l'option et la valeur).
Notez que myvariable contiendra tout ce que MySQL affiche en sortie standard (généralement tout sauf les messages d'erreur), y compris tous les en-têtes de colonnes, les cadres de travail ASCII, etc., qui peuvent être ou non ce que vous voulez.
MODIFIER:
Comme cela a été noté, il semble y avoir un paramètre -e
dans MySQL, je choisirais celui-là, définitivement.
Une manière plus directe serait:
myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a")
Pour lire les données ligne par ligne dans un tableau de Bash, vous pouvez procéder comme suit:
while read -a row
do
echo "..${row[0]}..${row[1]}..${row[2]}.."
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password)
Ou en variables individuelles:
while read a b c
do
echo "..${a}..${b}..${c}.."
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password)
Vous avez le tuyau en sens inverse et vous devez faire écho à la requête, comme ceci:
myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password)
Une autre alternative consiste à utiliser uniquement le client mysql, comme ceci
myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a")
(-s
est requis pour éviter l'art ASCII)
Maintenant, BASH n'est pas le langage le plus approprié pour gérer ce type de scénario, en particulier la gestion des chaînes et le fractionnement des résultats SQL, etc. Vous devez travailler beaucoup pour obtenir des choses très simples en Perl, Python ou PHP.
Par exemple, comment obtiendrez-vous chacun de A, B et C avec leur propre variable? C'est certainement faisable, mais si vous ne comprenez pas les pipes et l'écho (ce qui est très basique chez Shell), ce ne sera pas une tâche facile à faire. Si possible, j'utiliserais un langage mieux adapté.
Si vous voulez utiliser une seule valeur dans bash, utilisez:
companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1)
echo "$companyid"
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a)
sans l'espace vide après -p
. C'est trivial, mais sans ne fonctionne pas.
Si vous avez un nom de base de données particulier et un hôte sur lequel vous voulez que la requête soit exécutée, suivez la requête ci-dessous:
outputofquery=$(mysql -u"$dbusername" -p"$dbpassword" -h"$dbhostname" -e "SELECT A, B, C FROM table_a;" $dbname)
Donc, pour exécuter les requêtes mysql, vous devez installer le client mysql sur linux
Un autre exemple lorsque le nom de la table ou la base de données contient des caractères non pris en charge, tels qu'un espace ou '-'
db='data-base'
db_d=''
db_d+='`'
db_d+=$db
db_d+='`'
myvariable=`mysql --user=$user --password=$password -e "SELECT A, B, C FROM $db_d.table_a;"`
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT
use databaseName;
SELECT fieldName FROM tablename WHERE filedName='fieldValue';
QUERY_INPUT
)
echo "myvariable=$myvariable"