Expansion de la ligne de commande

Expansion de la ligne de commande

Mise à jour : Debian 10.2 - Buster

Avant que la ligne de commande ne soit exécutée, 8 types d'expansion sont réalisés dans l'ordre suivant :

Référence :

  Sommaire :

1 - Accolades {} : Énumérations

$ echo pre-{un,deux,trois}-post
pre-un-post pre-deux-post pre-trois-post
$ echo pre-{10..13}-post
pre-10-post pre-11-post pre-12-post pre-13-post
$ echo pre-{r..v}-post
pre-r-post pre-s-post pre-t-post pre-u-post pre-v-post
$ echo {p,q,z}xxx{1..3}
pxxx1 pxxx2 pxxx3 qxxx1 qxxx2 qxxx3 zxxx1 zxxx2 zxxx3

2 - Tilde ~ : Répertoires

~ : 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

3 - Dollard $ : Expansion de paramètre

3.1 - Expansions directe et indirecte

$ exemple='Ceci est une chaîne de caractères'
$ echo $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
$ 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

3.2 - Expansion avec passage minuscule vers majuscule : ^

$ echo ${i^}
Abcde1234ABCDE
$ echo ${i^^}
ABCDE1234ABCDE
$ echo ${i^^[bc]}
aBCde1234ABCDE

3.3 - Expansion avec passage majuscule vers minuscule : ,

$ i=abcde1234ABCDE
$ echo ${i,}
abcde1234ABCDE
$ echo ${i,,}
abcde1234abcde
$ echo ${i,,[BC]}
abcde1234AbcDE

3.3 - Expansion avec suppression d'un motif à partir du début

$ i=1234ABCD1234
$ echo ${i#123}
4ABCD1234
$ echo ${i#*23}
4ABCD1234
$ echo ${i##*23}
4

3.4 -  Expansion avec suppression d'un motif à partir de la fin 

$ i=1234ABCD1234
$ echo ${i%34}
1234ABCD12
$ echo ${i%23*}
1234ABCD1
$ echo ${i%%23*}
1

3.5 - Expansion avec remplacement de motif

$ i=1234ABCD1234
$ echo ${i/23/--bonjour--}
1--bonjour--4ABCD1234
$ echo ${i//23/--bonjour--}
1--bonjour--4ABCD1--bonjour--4

3.6 - Expansion sous-chaîne

$ echo ${i:4}
e1234ABCDE
$ echo ${i:4:3}
e12
$ echo ${i: 4: -3}
e1234AB
$ echo ${i: -4}
BCDE
$ echo ${i: -4:3}
BCD
$ echo ${i: -8: -3}
234AB

4 - Dollard $ : Substitution de commande

$ echo linux$(uname -r)
linux4.9.0-0.bpo.2-amd64

5 - Dollard $ : Expansion arithmétique

$((calcul)) : le résultat du calcul arithmétique

# Addition, soustraction, multiplication, division, exponentielle : + - * / **
$ echo $((1+2))
3
$ echo $((1+2**3))
9
$ echo $((((1+2**3))/7))
1

# Reste de la division
echo $((10 % 3))
1
# Post-incrémentation - post-décrémentation de variable : var++ var--
$ var=10
$ echo $(( var++ )) # La variable est incrémentée après l'expansion
10
$ echo $var
11

# Pré-incrémentation - pré-décrémentation de variable : ++var --var
$ var=10
$ echo $(( ++var )) # La variable est décrémentée avant l'expansion
11

# Incrémentation "classique"
$ var=10
$ echo $(( var=$var + 2 ))
12
# Changement de signe - conservation du signe : - +
$ var=10
$ echo $(( - $var ))
-10
$ var=-10
echo $(( + $var ))
-10
# Comparaison var1 et var2 : égaux, différents, plus grand, plus grand ou égal, plus petit, plus petit ou égal : == != > >= < <=
# echo $x $y
10 10
$ echo $(( $x == $y ))
1 # x est égal à y : vrai
$ echo $(( $x != $y ))
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

6 - Caractères spéciaux (wildcards) dans les noms de fichier : *,?, [ ]

$ touch photo1 photo2 photo3 photoa photob photoc
$ ls p*c
photoc
$ ls ph?toc
photoc
[[:alnum:]]   
[[:alpha:]]
[[:digit:]] [[:lower:]] [[:upper:]]

[[:blank:]]
[[:graph:]]
[[:print:]] [[:punct:]]
[[:space:]] [[:xdigit:]]
[![: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

7 - Caractères d'échappement \ , ' ' , " "

7.1 - Définition

$ echo $exemple \$exemple ~ \~
ceci est une chaîne de caractères $exemple /home/nom_utilisateur ~
$ echo '$exemple \$exemple ~ \~'
$exemple \$exemple ~ \~
$ echo "$exemple \$exemple ~ \~"
ceci est une chaîne de caractères $exemple ~ \~

7.2 - Exemples

$ echo ~
/home/user

$ echo toto{a,b,d,e}
totoa totob totod totoe

$ echo $((3^5/2*4))
11

$ echo $(date)
samedi 21 octobre 2017, 19:35:51 (UTC+0200)

$ variable="Démonstration"
$ echo $variable
Démonstration
$ echo "toto{a,b,c}"
toto{a,b,c}

$ echo "$(uname -r)"
4.9.0-4-amd64

echo "\$(uname -r)"
$(uname -r)
$ echo '$(uname -r)'
$(uname -r)

7.3 - Échappement des guillemets simples et doubles

$ echo "c'est un guillemet simple entre des guillemets doubles"
c'est un guillemet simple entre des guillemets doubles
$ echo '"bonjour"'
"bonjour"
$ echo 'bonjour'\''bonsoir'
bonjour'bonsoir

La solution consiste à terminer la première partie de la commande (bonjour), échapper l'apostrophe à laisser passer (\'), puis terminer la commande (bonsoir)