URL: https://linuxfr.org/forums/programmation-shell/posts/quoter-une-variable-contenant-des-arguments-de-ligne-de-commande Title: Quoter une variable contenant des arguments de ligne de commande Authors: JGO Date: 2013年06月16日T21:18:22+02:00 License: CC By-SA Tags: bash, tar et quote Score: 0 J'ai un script bash qui fait une sauvegarde incrémentale dans un tar.gz. Une des variables de configuration doit contenir un nom de répertoires avec caractère générique (glob), et je n'arrive pas à le faire passer ```bash ## Configuration de sauvegarde ############################## repertoires="/home/jgo /var/spool/mail/jgo" liste_exclusion="--exclude \"/home/jgo/divers/*\" --exclude \"/home/jgo/.recoll/xapiandb/*.DB\"" ciblelocale=/var/backup/ ## autres options ################# timestampsauvegarde=/home/jgo/timestamp-sauvegarde nouvelledate=`date "+%s"` nomclair=${ciblelocale}backup_${nouvelledate}.tar.gz temp=/tmp/ liste=${temp}/sauvegarde-liste ## fin de la configuration ########################## # Les fichiers à archiver rm -f $liste touch $liste for i in $repertoires ; do find $i -type f -newer $timestampsauvegarde>> ${liste} done # marche tar cfz test1-${nomclair} --files-from $liste --exclude "/home/jgo/divers/*" --exclude "/home/jgo/.recoll/xapiandb/*.DB" # ne marche pas (tar fonctionne mais les fichiers ne sont pas exclus) tar cfz test2-${nomclair} --files-from $liste ${liste_exclusion} # décommenter quand ça marche #touch ${timestampsauvegarde} ``` Le problème est dans la variable `$liste_exclusion`. Si je copie le contenu de cette variable sur la ligne du `tar`, tout marche bien (ligne `marhe`). Mais pour faire plus propre, je voudrais mettre ce contenu dans une variable au début du fichier. J'ai essayé diverses manières de mettre les guillemets : simples, doubles, le mode [ansi C quoting de bash] (http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_03.html), j'ai essayé d'échapper les quotes (\") et aussi les astérisques, et la présence ou l'absence guillemets autour de la variable à la ligne du tar (ou pas). La version plus haut est un exemple. Si je mets tar en pause (ctrl-Z) pendant son exécution pour avoir le temps de taper `ps -fe`, j'obtiens la ligne de commande telle qu'exécutée : `tar cfz /tmp/backup.tar.gz --files-from /tmp//sauvegarde-liste --exclude "/home/jgo/divers/*" --exclude "/home/jgo/.recoll/xapiandb/*.DB"` Si je copie directement les arguments sur la bonne ligne, j'ai la même chose sans les guillemets autour des répertoires (et ça marche). Si je mets les guillemets dans la variable ça ne marche pas parce que `tar` ne comprend pas les noms de fichiers entourés de guillemets, et si je ne mets pas les guillemets autour des noms de répertoires alors bash fait l'expansion de `*` (avec guillemets simples ou doubles dans la définition de la variable), ce qui met `tar` dans la confusion. J'ai bien une autre solution, utiliser `echo` dans le script pour écrire dans un fichier (`echo #!/bin/bash>> /tmp/script`, etc.) avec la syntaxe qui marche, faire `chmod 755` sur ce script et l'exécuter, mais c'est tout aussi moche que de mettre les paramètres sur la ligne de commande. Quelqu'un sait-il mettre les guillemets corrects dans la variable `$liste_exclusion` ? Même la page [Advanced Bash-Scripting Guide] (http://tldp.org/LDP/abs/html/quotingvar.html) contient des cas que personne ne comprend (il y a deux « Why? » dans les exemples), alors j'ai peu d'espoir de comprendre mieux moi-même.