====== Quoting ====== Quelques règles de base sur la façon de quoter les chaines de caractères. ===== b-a-ba ===== La plupart (tous ?) des shells interprêtent les chaines entre " mais pas celles entre '. Ex: shellprompt>toto='ma chaine'; echo $toto ma chaine shellprompt>toto='ma chaine'; echo "$toto" ma chaine shellprompt>toto='ma chaine'; echo '$toto' $toto Gestion des espaces, attention à quoter les noms de fichier, Ex shellprompt>mkdir test; cd test; touch fichier1 "mon 2e fichier" shellprompt>for f in *; do ls $f; done fichier1 ls: mon: No such file or directory ls: 2e: No such file or directory ls: fichier: No such file or directory shellprompt>for f in *; do ls "$f"; done fichier1 mon 2e fichier Et idem pour les passages de paramètres shellprompt>params='p1 p2 p3' shellprompt>for p in $params; do echo $p; done; p1 p2 p3 # on a bien 3 paramètres shellprompt>for p in "$params"; do echo $p; done; p1 p2 p3 # là il n'y en a plus qu'un Le caractère **\** sert de caractère d'échappement pour mettre le délimiteur dans une chaîne, sauf... shellprompt>echo "une chaine avec des \"guillemets\" à l'intérieur" une chaine avec des "guillemets" à l'intérieur shellprompt>echo 'une chaine avec l\'apostrophe dedans' # rien ne s'affiche # le shell attend une saisie car la chaine n'est pas fermée # le \' n'a pas été interprêté car la chaine est délimitée par des ' Heureusement, on peut mixer les délimiteurs suivant les besoins. shellprompt>var="Une chaîne quelconque" shellprompt>autrevar='$var a la valeur '"'$var'" shellprompt>echo $autrevar $var a la valeur 'Une chaîne quelconque' ===== Astuce grep ===== Pas grand chose à voir avec le quoting, mais un peu avec l'interprétation des chaines. ps aux |grep ssh # renvoie bien nos processus contenant la chaine ssh, # mais aussi le 'grep ssh', pas vraiment désiré ps aux |grep [s]sh # la ligne avec le 'grep ssh' a disparue # parce que grep interprête [s]sh comme 'ssh' # mais ps affiche le processus 'grep [s]sh', qui ne correspond pas au pattern 'ssh'