Mise à jour : Debian 11.2 - Bullseye
Référence :
L'interprétation de la ligne de commande suit les phases suivantes
Interprétation des métacaractères "Espace, Tabulation, Fin de ligne, Échappement, Apostrophe, Guillemets", découpage en "mots" de la ligne de commande
Expansion des accolages {}
Expansion du tilde ~
Expansion des paramètres du shell $(<variable>)
Découpe en mots des résultats des expansions réalisées précédemment
# Commentaire
| Filtre
; Séquences de commande
|| Ou conditionnel
&& Et conditionnel
& Exécution en arrière-plan
Cette première phase consiste à déterminer, avant les expansions éventuelles, les mots constituant la commande
Une chaîne de caractère qui ne comprend pas de séparateur (espaces, ou tabulations, ou nouvelles lignes) constitue un mot
$ echo un deux trois
#!/usr/bin/env bash
# Affichage des mots de la ligne de commande
echo "Nombre de mots passés en argument : $#"
# Affichage des arguments
i=1
while (($i<=$#));do
echo "Mot $i ###${!i}###"
i=$((++i))
done
$ ./mots un deux trois
Nombre de mots passés en argument : 3
Mot 1 ###un###
Mot 2 ###deux###
Mot 3 ###trois###
Note : Le nom du script n'est pas pris en compte dans le décompte et l'affichage des mots
Insérer un antislash devant chaque caractère à échapper : espace, tabulation ou nouvelle linge. Dans l'exemple ci-dessous,
les espaces entre un et deux, deux et trois sont échappés par le backslash
$ ./mots un\ deux\ trois
Nombre de mots passés en argument : 1
Mot 1 ###un deux trois###
./mots "un deux trois" quatre
Nombre de mots passés en argument : 2
Mot 1 ###un deux trois###
Mot 2 ###quatre###
$ ./mots 'un deux trois' quatre
Nombre de mots passés en argument : 2
Mot 1 ###un deux trois###
Mot 2 ###quatre###
Un mot peut commencer ou finir par un ou plusieurs séparateurs, ou ne comprendre que des séparateurs
$ ./mots " ce mot commence et finit par deux espaces "
Nombre de mots passés en argument : 1
Mot 1 ### ce mot commence et finit par deux espaces ###
$ ./mots "le mot qui suit comprend deux espaces" " "
Nombre de mots passés en argument : 2
Mot 1 ###le mot qui suit comprend deux espaces###
Mot 2 ### ###
Mots vides : Une paire de guillemets ou d'apostrophes comprenant 0 caractères est reconnu comme mot vide
$ ./mots "Un mot vide" "" "Entre deux mots"
Nombre de mots passés en argument : 3
Mot 1 ###Un mot vide###
Mot 2 ######
Mot 3 ###Entre deux mots###
La solution varie selon que le caractère d'échappement à inclure est dans un mot "échappé" ou non avec des apostrophes ou guillemets
$ echo anti\\slash
anti\slash
$ echo "anti\slash" 'anti\slash'
anti\slash anti\slash
$ echo l\'apostrophe
l'apostrophe
$ echo "l'apostrophe"
l'apostrophe
$ echo 'l'\''apostrophe'
l'apostrophe
$ echo un\"guillemet
un"guillemet
$ echo "un\"guillemet"
un"guillemet
$ echo 'un"guillemet'
un"guillemet
Utilisation d'une liste, séparation par des virgules ; ,
$ echo pre-{un,deux,trois}-post
pre-un-post pre-deux-post pre-trois-post
De premier chiffre à dernier chiffre, séparation par deux points ; ..
$ echo pre-{10..13}-post
pre-10-post pre-11-post pre-12-post pre-13-post
De premier caractère à dernier caractère, séparation par deux points : ..
$ echo pre-{r..v}-post
pre-r-post pre-s-post pre-t-post pre-u-post pre-v-post
Combinaisons d'énumération
$ echo {p,q,z}xxx{1..3}
pxxx1 pxxx2 pxxx3 qxxx1 qxxx2 qxxx3 zxxx1 zxxx2 zxxx3
Exception : { n'est pas expansé après $
~ : Répertoire de login ($HOME)
~+ : Répertoire courant ($PWD)
~- : Répertoire précédent ($OLDPWD)
$ cd ~/Téléchargement
$ cd ~/Bureau
$ echo ~ # ~ est le répertoire de login
/home/user
$ echo ~+ # ~+ est le répertoire courant
/home/user/Bureau
$ echo ~- # ~- est le répertoire précédent
/home/user/Téléchargement
$var ou ${var} : le contenu d'une variable
$ exemple='Ceci est une chaîne de caractères'
$ echo $exemple
ceci est une chaîne de caractères
$ i="HOME"
$ echo $i HOME
$ echo ${!i} /home/philippe
$n ou ${n} : la valeur du paramètre spécial n (compris entre 1 et 9) (nième argument de la dernière commande set, script ou fonction)
$ set un deux trois quatre
$ echo le nombre de paramètres est $#
le nombre de paramètres est 4
$ echo le paramètre 1 est $1
le paramètre 1 est un
$ echo le paramètre 4 est $4
le paramètre 4 est quatre
$ echo les paramètres sont $@
les paramètres sont un deux trois quatre
$ date
dimanche 13 août 2017, 22:59:26 (UTC+0200)
$ echo le pid de la dernière commande est $$
le pid de la dernière commande est 2167
$ echo le code de sortie de la dernière commande est $?
le code de sortie de la dernière commande est 0
On prend pour exemple la variable
$ var=abcde1234ABCDE
Passage minuscule vers majuscule : accent circonflexe "^"
$ echo ${var^}
Abcde1234ABCDE
$ echo ${var^^}
ABCDE1234ABCDE
$ echo ${var^^[bc]}
aBCde1234ABCDE
Passage majuscule vers minuscule : virgule ", "
$ echo ${var,}
abcde1234ABCDE
$ echo ${var,,}
abcde1234abcde
$ echo ${var,,[BC]}
abcde1234AbcDE
$ echo ${var#123}
4ABCD1234
$ echo ${var#*23}
4ABCD1234
$ echo ${var##*23}
4
$ echo ${var%34}
1234ABCD12
$ echo ${var%23*}1234ABCD1
Suppression depuis la fin jusqu'à la dernière occurrence du motif
$ echo ${var%%23*}1
$ i=1234ABCD1234
Remplacement 23 par --bonjour-- , première occurrence
$ echo ${var/23/--bonjour--}
1--bonjour--4ABCD1234
$ echo ${var//23/--bonjour--}
1--bonjour--4ABCD1--bonjour--4
$ echo ${var:4}
e1234ABCDE
$ echo ${var:4:3}
e12
$ echo ${var: 4: -3}e1234AB
$ echo ${var: -4}
BCDE
$ echo ${var: -4:3}
BCD
$ echo ${var: -8: -3}
234AB
$ echo $'\x63\x6f\x6e\x76\x65\x72\x73\x69\x6f\x6e'
conversion
$ echo $'\x269\x370'
&970
$ echo -n $'\t\n' |hexdump
00000000 09 0a
$((calcul)) : Le calcul arithmétique est effectué
$ echo $((1+2))
3
$ echo $((1+2**3))
9
$ echo $((((1+2**3))/7))
1
# Reste de la division
echo $((10%3))
1
Incrémentation / décrémentation de variable :
Pré-incrémentation / pré-décrémentation : ++var --var
$ for i in {1,2,3}; do echo $((++i)); done
2
3
4
$ for i in {1,2,3}; do echo $((i++)); done
1
2
3
Opérateur unitaire
$ var=10
$ echo $((- $var))
-10
$ var=-10
$echo $(( + $var ))
-10
Comparaison : égaux, différents, plus grand, plus grand ou égal, plus petit, plus petit ou égal : == != > >= < <=, résultat de l'opération est 1 si vrai, 0 si faux
# Comparaison var1 et var2 :
$ echo $(( 10 == 10 ))
1 # x est égal à y : vrai
$ echo $(( 10 != 10 ))
0 # x est différent de y : faux
$ echo $(( 10 >= 10 ))
1 # 10 est supérieur ou égal à 10 : vrai
$ echo $(( 10 > 10 ))
0 # 10 est supérieur à 10 : faux
$ echo "Nous sommes le $(date)"
Nous sommes le ven. 21 janv. 2022 12:27:53 CET
$ version=$(uname -r)
$ echo $version
5.15.0-0.bpo.2-amd64
Références :
$ ./mots '$(date)'
Nombre de mots passés en argument : 1
Mot 1 ###$(date)###
$ ./mots "$(date)"
Nombre de mots passés en argument : 1
Mot 1 ###lun. 24 janv. 2022 17:04:31 CET###
$ ./mots $(date)
Nombre de mots passés en argument : 6
Mot 1 ###lun.###
Mot 2 ###24###
Mot 3 ###janv.###
Mot 4 ###2022###
Mot 5 ###17:02:14###
Mot 6 ###CET###
$ echo -n "$IFS" |hexdump -C
00000000 20 09 0a | ..|
$ var="La variable contient plusieurs espaces"
$ ./mots $var
Nombre de mots passés en argument : 5
Mot 1 ###La###
Mot 2 ###variable###
Mot 3 ###contient###
Mot 4 ###plusieurs###
Mot 5 ###espaces###
$ IFS="$IFS:"
$ echo -n "$IFS" |hexdump -C
00000000 20 09 0a 3a | ..:|
$ var="colonne1:colonne2:colonne3"
$ ./mots $var
Nombre de mots passés en argument : 3
Mot 1 ###colonne1###
Mot 2 ###colonne2###
Mot 3 ###colonne3###
$ var="colonne1 : colonne2 : colonne3"
$ ./mots $var
Nombre de mots passés en argument : 3
Mot 1 ###colonne1###
Mot 2 ###colonne2###
Mot 3 ###colonne3###
$ var="colonne1::colonne2 :: colonne3"
$ ./mots $var
Nombre de mots passés en argument : 5
Mot 1 ###colonne1###
Mot 2 ######
Mot 3 ###colonne2###
Mot 4 ######
Mot 5 ###colonne3###
$ touch photo1 photo2 photo3 photoa photob photoc
* : remplace n'importe quelle chaîne de caractères
$ ls p*cphotoc
$ ls ph?tocphotoc
[[:classe:]] : remplace n'importe quel caractère dans une liste définie par une classe alphanumérique, alphabétique, numérique, minuscule, majuscule, ....
[[:alnum:]] [[:alpha:]] [[:digit:]] [[:xdigit:]]
[[:lower:]] [[:upper:]]
[[:blank:]] [[:space:]]
[[:punct:]] [[:graph:]] [[:print:]]
[![:classe:]] : remplace n'importe quel caractère n'appartenant pas à un classe
[![:blank:]]
$ ls photo[1ac]
photo1 photoa photoc
$ ls photo[1-3]
photo1 photo2 photo3
$ ls photo[a-c]
photoa photob photoc
$ ls photo[^1ac]
photo2 photo3 photob
Les caractères > et < - Substitution de process : Voir Redirections & enchaînements