====== 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'