B. Fiches de référence

Les Fiches de référence suivantes apportent un résumé utile de certains concepts dans l'écriture des scripts. Le texte suivant traite de ces sujets avec plus de profondeur et donne des exemples d'utilisation.

Tableau B.1. Variables spéciales du shell

Variable Signification
$0 Nom du script
$1 Paramètre de position #1
$2 - $9 Paramètres de position #2 - #9
${10} Paramètre de position #10
$# Nombre de paramètres de position
"$*" Tous les paramètres de position (en un seul mot) *
"$@" Tous les paramètres de position (en des chaînes séparées)
${#*} Nombre de paramètres de position
${#@} Nombre de paramètres de position
$? Code de retour
$$ Numéro d'identifiant du processus (PID) généré par le script
$- Options passées au script (utilisant set)
$_ Dernier argument de la commande précédente
$! Identifiant du processus (PID) du dernier job exécuté en tâche de fond

* Doit être entre guillemet, sinon il vaudra par défaut « $@ ».

Tableau B.2. Opérateurs de test : comparaison binaire

Opérateur Signification ----- Opérateur Signification
         
Comparaison arithmétique     Comparaison de chaînes  
-eq Égal à   = Égal à
      == Égal à
-ne Différent de   != Différent de
-lt Plus petit que   \< Plus petit que (ASCII) *
-le Plus petit que ou égal à      
-gt Plus grand que   \> Plus grand que (ASCII) *
-ge Plus grand que ou égal à      
      -z Chaîne vide
      -n Chaîne non vide
         
Comparaison arithmétique Entre doubles parenthèses (( ... ))      
> Plus grand que      
>= Plus grand que ou égal à      
< Plus petit que      
<= Plus petit que ou égal à      

* Si à l'intérieur d'une construction de tests à double crochets [[ ... ]] , alors l'échappement \ n'est pas nécessaire.

Tableau B.3. Opérateurs de test : fichiers

Opérateur Tests si ----- Opérateur Tests si
-e Le fichier existe   -s Le fichier est vide
-f Le fichier est un fichier standard      
-d Le fichier est un répertoire   -r Le fichier a un droit de lecture
-h Le fichier est un lien symbolique   -w Le fichier a un droit en écriture
-L Le fichier est un lien symbolique   -x Le fichier a le droit d'exécution
-b Le fichier est un périphérique bloc      
-c Le fichier est un périphérique caractère   -g L'option sgid est positionnée
-p Le fichier est un tube   -u L'option suid est positionnée
-S Le fichier est un socket   -k L'option « sticky bit » est positionnée
-t Le fichier est associé à un terminal      
         
-N Le fichier a été modifié depuis sa dernière lecture   F1 -nt F2 Le fichier F1 est plus récent que F2 *
-O Vous êtes le propriétaire du fichier   F1 -ot F2 Le fichier F1 est plus ancien que F2 *
-G L'identifiant du groupe du fichier est le même que vous   F1 -ef F2 Les fichiers F1 et F2 sont des liens vers le même fichier *
         
! NOT (inverse le résultat des tests ci-dessus)      

* Opérateur binaire (nécessite deux opérandes).

Tableau B.4. Substitution et expansion de paramètres

Expression Signification
${var} Valeur de var (identique à $var)
   
${var-DEFAUT} Si var n'est pas initialisé, évalue l'expression DEFAUT *
${var:-DEFAUT} Si var n'est pas initialisé ou est vide, évalue l'expression DEFAUT *
   
${var=DEFAUT} Si var n'est pas initialisé, évalue l'expression DEFAUT *
${var:=DEFAUT} Si var n'est pas initialisé, évalue l'expression DEFAUT *
   
${var+AUTRE} Si var est initialisé, évalue l'expression AUTRE, sinon est une chaîne null
${var:+AUTRE} Si var est initialisé, évalue l'expression AUTRE, sinon est une chaîne null
   
${var?ERR_MSG} Si var n'est pas initialisé, affiche ERR_MSG et interrompt l'exécution avec un code de sortie de 1.*
${var:?ERR_MSG} Si var n'est pas initialisé, affiche ERR_MSG et interrompt l'exécution avec un code de sortie de 1.*
   
${!varprefix*} Correspond à toutes les variables déclarées précédemment et commençant par varprefix
${!varprefix@} Correspond à toutes les variables déclarées précédemment et commençant par varprefix

* Si var est initialisé, évalue l'expression comme $var, sans effet de bord.

Tableau B.5. Opérations sur les chaînes

Expression Signification
${#chaine} Longueur de $chaine
   
${chaine:position} Extrait la sous-chaîne à partir de $chaine jusqu'à $position
${chaine:position:longueur} Extrait $longueur caractères dans la sous-chaîne à partir de $chaine jusqu'à $position [indexé par zéro, le premier caractère à la position 0]
   
${chaine#sous-chaine} Supprime la plus petite correspondance de $sous-chaine à partir du début de $chaine
${chaine##sous-chaine} Supprime la plus grande correspondance de $sous-chaine à partir du début de $chaine
${chaine%sous-chaine} Supprime la plus courte correspondance de $sous-chaine à partir de la fin de $chaine
${chaine%%sous-chaine} Supprime la plus longue correspondance de $sous-chaine à partir de la fin de $chaine
   
${chaine/sous-chaine/remplacement} Remplace la première correspondance de $sous-chaine avec $remplacement
${chaine//sous-chaine/remplacement} Remplace toutes les correspondances de $sous-chaine avec $remplacement
${chaine/#sous-chaine/remplacement} Si $sous-chaine correspond au début de $chaine, substitue $remplacement par $sous-chaine
${chaine/%sous-chaine/remplacement} Si $sous-chaine correspond à la fin de $chaine, substitue $remplacement par $sous-chaine
   
   
expr match "$chaine" '$sous-chaine' Longueur de $sous-chaine* correspondant au début de $chaine
expr "$chaine" : '$sous-chaine' Longueur de $sous-chaine* correspondant au début de $chaine
expr index "$chaine" $sous-chaine Position numérique dans $chaine du premier caractère correspondant dans $sous-chaine [0 s'il n'y a pas de correspondance, et le premier caractère en position 1]
expr substr $chaine $position $longueur Extrait $longueur caractères à partir de $chaine commençant à $position [0 s'il n'y a pas de correspondance, et le premier caractère en position 1]
expr match "$chaine" '\($sous-chaine\)' Extrait $sous-chaine*, en cherchant à partir du début de $chaine
expr "$chaine" : '\($sous-chaine\)' Extrait $sous-chaine* en cherchant à partir du début de $chaine
expr match "$chaine" '.*\($sous-chaine\)' Extrait $sous-chaine* en cherchant à partir de la fin de $chaine
expr "$chaine" : '.*\($sous-chaine\)' Extrait $sous-chaine* en cherchant à partir de la fin de $chaine

*$sous-chaine est une Expression rationnelle.

Tableau B.6. Syntaxes diverses

Expression Interprétation
   
Crochets  
if [ CONDITION ] Construction de tests
if [[ CONDITION ]] Construction de tests étendue
Tableau[1]=element1 Initialisation d'un tableau
[a-z] Suite de caractères au sein d'une Expression rationnelle
   
Accolades  
${variable} Substitution de paramètres
${!variable} Référence de variable indirecte
{ commande1; commande2; ... commandeN; } Bloc de code
{chaine1,string2,string3,...} Expansion
{a..z} Expansion d'accolades
{} Remplacement de texte, après find et xargs
   
   
Parenthèses  
( commande1; commande2 ) Groupe de commandes exécutées dans un sous-shell
Tableau=(element1 element2 element3) Initialisation d'un tableau
result=$(COMMANDE) Substitution de commande, nouvelle manière
>(COMMANDE) Substitution de processus
<(COMMANDE) Substitution de processus
   
Double parenthèses  
(( var = 78 )) Arithmétique sur des entiers
var=$(( 20 + 5 )) Arithmétique sur des entiers, avec affectation de variables
(( var++ )) Incrément de variables style C
(( var-- )) Incrément de variables style C
(( var0 = var1<98?9:21 )) Opération à trois arguments
   
Guillemets  
"$variable" Guillemets "faibles"
'chaine' Guillements 'forts'
   
Guillemets inverses  
result=`COMMANDE` Substitution de commande, manière habituelle