Vous utiliserez souvent des guillemets dans la ligne de commande Linux. Traiter avec des espaces dans le nom de fichier? Vous utilisez des guillemets. Gérer les caractères spéciaux ? Vous utilisez à nouveau des guillemets.
Les guillemets sont une "fonctionnalité spéciale" dans le shell Linux et cela peut prêter à confusion, surtout si vous débutez avec les commandes Linux et les scripts shell.
J'expliquerai les différents types de guillemets et leur utilisation dans les scripts shell.
Il existe quatre types différents de guillemets :
- Apostrophe '
- Citation double "
- Barre oblique inverse \
- Citation arrière `
À l'exception du jeu, les trois autres caractères apparaissent par paires.
Voyons-les en détail.
1. Guillemet simple
Le guillemet simple dans Shell ignore tous les types de caractères spéciaux qu'il contient. Tout ce qui se trouve entre les guillemets simples est considéré comme un seul élément.
Prenons-le avec exemple. Voici un exemple de fichier texte avec des joueurs de cricket des années 90.
[email protected]:~$ cat cricket
Allan Donald, South Africa
Steve Waugh, Australia
Mark Waugh, Australia
Henry Olonga, Zimbabwe
Sachin Tendulkar, India
Maintenant, vous utilisez la commande grep pour rechercher des joueurs de cricket avec le nom de famille Waugh. Cela vous donnera deux résultats :
[email protected]:~$ grep Waugh cricket
Steve Waugh, Australia
Mark Waugh, Australia
Mais si vous souhaitez rechercher uniquement Steve Waugh et que vous essayez de l'utiliser tel quel, vous verrez une erreur :
[email protected]:~$ grep Steve Waugh cricket
grep: Waugh: No such file or directory
cricket:Steve Waugh, Australia
Pourquoi? Parce que l'espace est utilisé pour séparer la commande, les options et les arguments. Dans l'exemple ci-dessus, il faut Steve
comme premier argument de grep mais Waugh
et cricket
sont considérés comme les fichiers dans lesquels il doit effectuer la recherche. Puisqu'il n'y a pas de fichier nommé Waugh
, il jette une erreur pour cela. En même temps, il affiche également le résultat du fichier cricket
.
C'est là que la citation vient à la rescousse. Lorsque vous placez les arguments entre guillemets, cela est interprété comme une seule entité.
[email protected]:~$ grep 'Steve Waugh' cricket
Steve Waugh, Australia
Fondamentalement, lorsque le shell voit le premier guillemet simple, il ignore tous les caractères spéciaux (l'espace blanc est également un caractère spécial) jusqu'à ce qu'il trouve un autre guillemet simple (guillemets fermants).
Ignorer tous les caractères spéciaux
Tous les caractères spéciaux perdent leur signification s'ils sont entourés de guillemets simples. Voyons cela avec des exemples.
Déclarons une variable en shell. Si vous renvoyez le nom de la variable avec $, il affiche la valeur de la variable.
[email protected]:~$ var=my_variable
[email protected]:~$ echo $var
my_variable
Mais si vous l'enveloppez de guillemets simples, $ perdra son pouvoir spécial.
[email protected]:~$ echo '$var'
$var
Maintenant seulement ça. La touche Entrée est également conservée sous des guillemets simples.
[email protected]:~$ echo 'how are
> you?'
how are
you?
2. Guillemet double
Les guillemets doubles fonctionnent presque de la même manière que les guillemets simples. Presque parce qu'ils ont aussi tendance à ignorer tous les caractères spéciaux sauf :
- Le dollar signe $
- Citations arrière `
- Barres obliques inverses \
Puisque le signe dollar n'est pas ignoré, vous pouvez vous attendre à ce que le nom de la variable soit remplacé par sa valeur. Ce qui n'est pas le cas avec les guillemets simples.
[email protected]:~$ var=my_variable
[email protected]:~$ echo "$var"
my_variable
[email protected]:~$ echo '$var'
$var
Les guillemets doubles peuvent être utilisés pour masquer les guillemets simples du shell.
[email protected]:~$ var=My 'own villa' is yellow
own villa: command not found
[email protected]:~$ var="My 'own villa' is yellow"
[email protected]:~$ echo $var
My 'own villa' is yellow
De même, vous pouvez utiliser les guillemets simples pour masquer les guillemets doubles du shell.
[email protected]:~$ var=he said, "Awesome!"
said,: command not found
[email protected]:~$ var='he said, "Awesome!"'
[email protected]:~$ echo $var
he said, "Awesome!"
3. Barre oblique inverse
La barre oblique inverse revient à mettre des guillemets simples autour d'un seul caractère. La barre oblique inverse "échappe" au caractère avant lequel elle est placée.
Cela signifie que le caractère suivi de la barre oblique inverse perdra sa signification particulière (le cas échéant).
[email protected]:~$ var=variable
[email protected]:~$ echo \var
var
[email protected]:~$ echo $var
variable
[email protected]:~$ echo \$var
$var
Parce que v
n'a pas de signification particulière, echo \var
imprime simplement var. En revanche, lorsqu'il est utilisé avec $var
, la barre oblique inverse échappe à la signification spéciale de $
et donc il est imprimé comme $var
au lieu de la valeur de var
.
Continuer la ligne avec antislash
Vous remarquerez une autre utilisation pratique du caractère barre oblique inverse en continuant une seule commande sur plusieurs lignes.
Lorsqu'une commande est trop longue ou s'il s'agit d'une combinaison de commandes, certains sites Web utilisent une barre oblique inverse pour afficher la commande unique sur plusieurs lignes. Cela rend la commande/le code plus lisible.
Prenez cette longue commande par exemple.
docker run --name server --network net -v html:/usr/share/nginx/html -v $PWD/custom-config.conf:/etc/nginx/nginx.conf -p 80:80 --restart on-failure -d nginx:latest
La même commande peut être décomposée en plusieurs lignes grâce aux antislashs.
docker run --name server --network net \
-v html:/usr/share/nginx/html \
-v $PWD/custom-config.conf:/etc/nginx/nginx.conf \
-p 80:80 --restart on-failure -d nginx:latest
C'est la même commande, juste un peu plus facile à comprendre.
Barre oblique inverse entre guillemets doubles
La barre oblique inverse est l'un des trois caractères spéciaux qui conserve sa signification particulière avec le signe dollar et les guillemets arrière.
De cette façon, vous pouvez utiliser une barre oblique inverse pour échapper à la signification particulière du signe dollar, des guillemets doubles et des guillemets arrière entre guillemets doubles.
Prenons l'exemple ci-dessous où $5
est considérée comme une variable non déclarée et n'a donc aucune valeur. C'est pourquoi il est ignoré de la sortie de la commande echo.
[email protected]:~$ echo "Meal costs $5.25"
Meal costs .25
Pour utiliser ce $ sans être interprété comme la valeur d'une variable, il faut lui échapper avec /.
[email protected]:~$ echo "Meal costs \$5.25"
Meal costs $5.25
Ici, la barre oblique inverse (\) est interprétée pour sa superpuissance, qui est d'échapper à la signification spéciale du caractère suivant.
4. Citations arrière
Le dernier de cette liste est des guillemets et il a une signification particulière. Il est utilisé pour la substitution de commandes.
Le shell a cette fonctionnalité de substitution de commande où une commande spécifiée est remplacée par la sortie de la commande.
Dans l'exemple ci-dessous, `date` est remplacé par la sortie de la commande date indiquant la date et l'heure actuelles du système Linux.
[email protected]:~$ echo The current date and time is `date`
The current date and time is Monday 23 August 2021 04:55:18 PM IST
Une chose à garder à l'esprit est que la substitution n'aura lieu que s'il y a une commande entre les guillemets arrières. Sinon, il est affiché tel quel.
[email protected]:~$ echo 'The current date and time is `late`'
The current date and time is `late`
Encore une fois, les guillemets doubles interprètent les guillemets inverses mais les guillemets simples ignorent sa signification particulière.
Les contre-guillemets ne sont plus recommandés
Pendant des années, les apostrophes ont été utilisées pour la substitution de commandes dans les scripts Shell. Mais de nos jours, les systèmes UNIX et Linux modernes préfèrent le $(command)
construire à la place.
[email protected]:~$ echo The current date and time is $(date)
The current date and time is Monday 23 August 2021 05:55:47 PM IST
Restez avec le temps et arrêtez d'utiliser les guillemets arrière maintenant.
J'espère que vous comprenez mieux les guillemets sous Linux et les scripts shell maintenant.
Veuillez laisser vos suggestions et questions dans la section des commentaires.