J'essaie d'exécuter la commande suivante :
mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig"
Je le stocke dans une chaîne :
cmd="mysql AMORE -u username -ppassword -h localhost -e\"SELECT host FROM amoreconfig\""
Testez-le :
echo $cmd
mysql AMORE -u username -ppassword -h localhost -e"SELECT host FROM amoreconfig"
Essayez d'exécuter en faisant :
$cmd
Et j'obtiens la page d'aide de mysql :
mysql Ver 14.14 Distrib 5.1.31, for pc-linux-gnu (i686) using readline 5.1
Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Usage: mysql [OPTIONS] [database]
(...)
Je suppose que je fais quelque chose de mal avec les guillemets mais je n'arrive pas à trouver la cause du problème.
11 votes
Je vous recommande de lire ceci : mywiki.wooledge.org/BashFAQ/050
4 votes
@DennisWilliamson - excellent lien ; j'aime particulièrement ceci : " Si votre tête est tellement enfoncée dans votre cul que vous pensez toujours que vous devez écrire chaque commande que vous êtes sur le point d'exécuter avant de l'exécuter "Je me demande comment l'auteur de ce texte résoudrait un script où vous construisez une commande dynamiquement, et où vous voulez explicitement la répercuter - afin de demander à l'utilisateur "Voulez-vous exécuter cette commande ?" avant qu'elle ne soit exécutée ?
0 votes
@sdaau, cela dépend de l'approche utilisée parmi celles données dans la FAQ. Pour une fonction, on peut imprimer son texte avec
declare -f
; pour un tableau (l'approche typique "construite dynamiquement") :printf '%q ' "${array[@]}"; echo
.5 votes
L'approche des meilleures pratiques, d'ailleurs, est la suivante pas pour stocker votre commande sous forme de chaîne. Si vous voulez la construire dynamiquement, faites-le avec un tableau. Utilisation de
eval
comme le font les meilleures réponses, présente un risque important pour la sécurité (en ouvrant la porte à des attaques par injection de coquille si le contenu est paramétré).0 votes
@DennisWilliamson -- J'aime bien faire ça pour une fonction --dryrun dans un [gros] shell qui a plusieurs phases et que l'utilisateur peut sauter. Cela a du sens ?
0 votes
@mobibob : en utilisant
getopts
par exemple, si dryrun alorsset -x
.