Cette fiche reprend les notions vues lors du CTP n°3. Vous retrouverez synthétisées sur cette page les différentes commandes utilisées, leur intérêt et comment nous avons pu les utiliser lors des manipulations sur ordinateur.
Table des matières
<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Définition et utilisation
Une variable est un nom qui est associé à une valeur. En shell, les variables sont des chaînes de caractères. Le développement d’une variable est le remplacement du nom de la variable par sa valeur.
Par exemple, la variable PS1 est la variable qui contient le prompt du shell. Lors des TP précédents, quand vous tapiez la commande PS1='$ ', vous avez affecté la chaîne $<space> à la variable PS1. Lorsque le shell affiche le prompt, il développe la variable PS1 et affiche la chaîne $<space>.
Les variables du shell sont des variables d’environnement. Elles sont accessibles à tous les processus lancés par le shell. On peut les lister avec la commande env ou printenv. On peut également les lister avec la commande set qui liste également les variables internes du shell (voir la page de manuel de set pour plus de détails).
</aside>
<aside>
<img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Variables et commande echo
Pour créer une variables, on utilise la syntaxe suivante :
$ nom_variable=<contenu de la variable>
On peut créer plusieurs variables dans une même ligne de commande en séparant chaque variable créée par un espace.
<aside> <img src="/icons/report_red.svg" alt="/icons/report_red.svg" width="40px" /> Attention !
Si l’on met un espace avant ou après le symbole = (ex : variable =var.c ou variable= var.c) dans la création d’une variable, alors le Shell nous renvoie une erreur (command not found).
</aside>
La commande echo permet d’afficher quelque chose mis en argument dans le Shell. Le $ permet de référer à la variable dont le nom est indiqué après ce symbole, ce qui a pour effet avec la commande echo d’afficher son contenu.
Si la variable mise en argument n’existe pas, alors cela affiche une ligne vide (pas d’erreur) dans le Shell.
On peut intégrer des variables à l’intérieur de nouvelles variables créées, pour cela on utilise le symbole $ en le plaçant avant le nom de la variable que l’on souhaite intégrer. Il faut les définir avant la variable qui les intègre, de plus si l’on modifie les valeurs des variables intégrées alors ça ne change pas le contenu original de la variable qui les contient.
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
$ sujet=Alice verbe=aime cod=piscine # Création de 3 variables
$ phrase="$sujet $verbe la $cod." # Création d'une variable intégrant les 3 autres créées
$ echo $phrase
Alice aime la piscine.
$ sujet=Bob verbe=mange cod=salade # Modification des 3 premières variables créées
$ echo $phrase
Alice aime la piscine. # La variable `phrase` n'a pas été modifiée
$ echo "$sujet $verbe la $cod."
Bob mange la salade. # Cette fois les valeurs modifiées sont affichées
</aside>
</aside>
<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Caractères spéciaux du Shell
Certains caractères ont une signification particulière pour le shell : on dit qu’ils sont spéciaux. À l’inverse, on dit d’un caractère qui n’a pas d’autre signification que lui-même, qu’il a son sens littéral. Nous listons ci-dessous les caractères spéciaux ; la plupart d’entre eux seront vus en détail plus tard dans le cours.
; <newline> | & ils mettent fin à la commande qui les précède. On a utilisé <newline> pour représenter le caractère nouvelle ligne qu’on saisit avec la touche Entrée. Le caractère spécial | est saisi avec la combinaison de touches Alt Gr-6 (Option-Shift-l sous mac), on l’appelle pipe ou conduite. Le caractère spécial & est saisi avec la combinaison de touches Alt Gr-8 et sert à lancer des commandes en arrière-plan.< > appelés chevrons, ils permettent les redirections.( ) pour regrouper des commandes et les lancer dans un sous-shell.$ pour le développement de variables, le développement arithmétique et la substitution de commande.Alt Gr-7 suivie d’un espace.<space> <tab> délimitent les noms de commandes et arguments.\\ ' " la contre-oblique (aussi appelée backslash ou antislash), l’apostrophe (en anglais single quote) et le guillemet anglais (en anglais double quote) qui permettent justement d’inhiber les caractères spéciaux, c’est-à-dire leur rendre leur sens littéral.Enfin, les caractères suivants ont une signification particulière dans certains contextes et doivent donc parfois être inhibés:
? ] Pour le développement de noms de chemins.# Pour écrire des commentaires (sauf s’il est au milieu d’un mot).~ Pour le développement du tilde (répertoire personnel).= Pour l’affectation de variables.% Pour le contrôle des tâches (job control).
</aside><aside>
<img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Contre-oblique (\\)
Le caractère \\ permet de retirer de son action le caractère spécial suivant ce symbole.
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
$ echo "salut"
salut
$ echo \\"salut\\"
"salut"
$ echo 3$canadiens
3
$ echo 3\\$canadiens
3$canadiens
$ mv a\\ b c
# Cette commande ne contient que 2 arguments : `a b` et `c`
# Ici le `\\`rend l'espace membre du nom du premier argument
# Sans cela, on aurait eu 3 arguments (`a`, `b` et `c`)
</aside>
La commande \\ suivie de <newline> permet de créer une nouvelle ligne après la commande pour y entrer son argument à afficher. C’est pour cela que echo \\ renvoie une ligne débutant par > où l’on entre l’argument de la commande echo précédente.
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
$ echo \\
> pomme de terre
pomme de terre
</aside>
Pour afficher \\, on doit placer un \\ devant pour annuler son action, ce qui revient à entrer la commande echo \\\\. Pour afficher \\\\, en utilisant la même logique, on entre echo \\\\\\\\.
</aside>
<aside>
<img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Apostrophe (')
Aucun caractère n’est spécial entre apostrophes, mis à part les ' : lorsque l’on a une apostrophe dans un message entre apostrophes, cela revient à fermer la première. Donc la dernière apostrophe qui clôture le message, a en réalité pour rôle d’ouvrir à nouveau les apostrophes : l’utilisateur doit donc y intégrer des arguments jusqu’à ce qu’il souhaite refermer l’apostrophe en entrant ' comme argument.
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
$ echo 'le seul caractère spécial entre apostrophes n'est-il pas apostrophe ?'
> test
> echo
> '
le seul caractère spécial entre apostrophes nest-il pas apostrophe ?
test
echo
</aside>
Pour obtenir une apostrophe dans une chaîne entre apostrophes, on place \\ à l’extérieur de la chaîne mise entre apostrophes que l’on referme au moment de placer le '.
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
$ echo 'Salut c'\\''est cool'
Salut c'est cool
</aside>
On peut mixer apostrophes et contre-obliques pour obtenir un affichage désiré.
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
$ echo 'Un développement de variable (comme $var) peut-il s'\\''inhiber; par exemple entre apostrophes ?'
Un développement de variable (comme $var) peut-il s'inhiber; par exemple entre apostrophes ?
</aside>
</aside>
<aside>
<img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Guillemets anglais (")
Les caractères spéciaux entre “ sont : $ qui permet l’expansion de variables, ``` pour l’exécution de commandes et l'insertion du résultat et \\ pour échapper les caractères spéciaux afin qu'ils soient interprétés littéralement.
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemples
$ echo " Entre \\" , on peut aussi
> écrire sur plusieurs
> lignes"
Entre " , on peut aussi
écrire sur plusieurs
lignes
$ nom=Alice
$ echo "$nom scripte en shell"
Alice scripte en shell
$ echo "\\$nom scripte en shell"
$nom scripte en shell
$ echo "Aussi sûr que 2 et 2 font $((2 + 2))"
Aussi sûr que 2 et 2 font 4
$ echo "Aussi sûr que 2 et 2 font \\$((2 + 2))"
Aussi sûr que 2 et 2 font $((2 + 2))
$ echo "le chemin absolu du répertoire courant est `pwd`"
le chemin absolu du répertoire courant est /home/debian
$ echo "le chemin absolu du répertoire courant est \\`pwd\\`"
le chemin absolu du répertoire courant est `pwd`
</aside>
<aside> <img src="/icons/thought_lightgray.svg" alt="/icons/thought_lightgray.svg" width="40px" /> Remarque
Par rapport au caractère $, si la variable désignée est une chaîne de caractères avec retours à la ligne, alors l’affichage est différent selon :
Par exemple, on a :
$ mavar="Alice
> et
> Bob"
$ echo $mavar font plein de choses
Alice et Bob font plein de choses
$ echo "$mavar font plein de choses"
Alice
et
Bob font plein de choses
</aside>
Le caractère \\ est utilisé pour échapper des caractères spéciaux à l'intérieur des guillemets anglais, ce qui signifie que ces caractères seront interprétés littéralement plutôt que spécialement.
Par exemple, "Ceci est un \\"exemple\\"" affichera les guillemets doubles (") comme partie de la chaîne plutôt que de les interpréter comme une fin ou un début de chaîne.
Les développements qui n’ont jamais lieu entre les guillemets anglais sont *, ?, ] pour le développement de noms de chemins. De même pour le ~ avec le répertoire personnel.
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
$ echo "? * et [ sont utilisés pour le développement de chemins"
? * et [ sont utilisés pour le développement de chemins
$ echo "~ provoque un développement du tilde"
~ provoque un développement du tilde
</aside>
</aside>
<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Pourquoi plusieurs méthodes d’inhibition ?
Les mécanismes d'inhibition multiples offrent une flexibilité d'utilisation. Chaque mécanisme a un rôle spécifique :
' ') sont utiles lorsque l’on veut que tout soit interprété littéralement, sans exceptions." ") sont plus flexibles et permettent l'expansion de variables et l'exécution de commandes.\\ permet d'échapper sélectivement des caractères spéciaux à l'intérieur des guillemets doubles, ce qui est utile lorsque l’on a besoin d'inclure des caractères spéciaux littéralement dans une chaîne.
</aside><aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Extensions de chemins
Lorsqu’on saisit un chemin contenant des wildcards ou caractères joker, le shell le développe en remplaçant les caractères spéciaux *, ? et [ par les noms des fichiers qui correspondent à l’expression régulière qui résulte de l’extension du chemin. On appelle ce mécanisme l’extension de chemin.
Par exemple, si le répertoire courant contient les fichiers a, b, c, d et e, alors le chemin a* est développé en a, le chemin ? en a b c d e et le chemin [a-c] en a b c.
L’extension de chemin est effectuée par le shell, avant que la commande ne soit exécutée. Si aucun fichier ne correspond à l’expression régulière, le shell laisse le chemin tel quel.
</aside>
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Déplacer plusieurs fichiers avec une caractéristique commune
</aside>