next up previous contents Next: Commandes internes. Up: Scripts de shell avancés. Previous: Paramètres spéciaux: $?, $*,   Table des matières  

21.3 Développements.

Le terme développement (ou en anglais: expansion) se rapporte à la manière dont bash modifie la ligne de commande avant de l'exécuter. bash réalise plusieurs modifications de texte de la ligne de commande, en procédant dans l'ordre que voici:

Développement d'accolades (brace expansion):
vous pouvez utiliser,
par exemple, le raccourci touch fichier{1,2,3}.txt pour créer plusieurs fichiers intitulés fichier1.txt,fichier2.txt et fichier3.txt. Cette méthode est connue sous le nom de développement d'accolades (brace expansion). Elle se produit avant tout autre type de modification de la ligne de commande.

Développement de tilde (tilde expansion):
le caractère spécial ~ (tilde) est remplacé par le chemin complet contenu dans la variable d'environnement HOME, ou par le répertoire home propre à chaque utilisateur (si $HOME est vide). ~+ est remplacé par le répertoire de travail courant et ~- est substitué par le répertoire de travail, précédant qui est le plus récent. Ces deux derniers développements sont peu utilisés.

Développement de paramètre (parameter expansion):
ce terme se rapporte au développement de tout terme commençant par un signe $. Notez que $VAR et ${VAR} opèrent exactement la même manière, à ceci près que, dans le second cas, la variable peut contenir des caractères ne formant pas de mots entiers (non-''whole word'') qui normalement pourraient amener une confusion dans l'interprétation que doit en faire bash.
Il y a plusieurs astuces pour le développement de paramètres dont vous pouvez tirer parti afin de manipuler des chaînes. La plupart des programmeurs du shell ne les exploitent pas, probablement parce que les autres UNIX les tolèrent mal.

${VAR:-default}
A moins que le paramètre $VAR ne soit vide ou inexistant (dans ce cas, le message d'erreur ``message'' sera émis), cette expression équivaut à $VAR.

${VAR:=default}
Comme précédemment, mais default est attribué à VAR au cas où cette variable est vide.

${VAR:-default}
Ceci produit une chaîne vide dans $VAR sauf si VAR est inexistant ou vide. Le comportement est inverse de celui de ${VAR:-default}

${VAR:?message}
Ceci produira $VAR sauf si VAR est vide ou inexistant. Dans ce cas, le message d'erreur ``message'' sera affiché.

${VAR:offset} ou ${VAR:n:l}
Ceci renvoie le n $^{\textrm{ième}}$ caractère de $VAR et les l caractères suivants. Si l n'est pas stipulé, tous les caractères à la droite du n $^{\textrm{ième}}$ caractère seront affichés. Ceci est utile lorsqu'il faut diviser une chaîne. Essayez:

TEXT=scripting_for_phun

echo ${TEXT:10:3}

echo ${TEXT:10} 


${#VAR}
affiche le nombre de caractères composant $VAR.

${!PRE*}
affiche la liste de toutes les variables dont les noms commencent pas PRE.

${VAR#pattern}
le contenu de $VAR est affiché alors que l'expression globale pattern est supprimée dans la partie de tête de la chaîne. Par exemple, lorsque ${TEXT#scr} est appliqué à l'exemple précédant, la chaîne suivante est affichée ipting_for_phun.

${VAR##pattern}
effectue le même travail que dans le cas qui précède mais si pattern contient des caractères de remplacement (jokers), l'expression tentera de rechercher une correspondance sur toute la chaîne des caractères.

${VAR%pattern}
Idem que dans le cas de ${VAR#pattern}, sauf que les caractères sont éliminés de la partie résiduelle de la chaîne.

${VAR%%pattern}
Idem que dans ${VAR##pattern}, sauf que les caractères sont éliminés de la partie résiduelle de la chaîne.

${VAR/search/replace}
$VAR est retournée avec la première occurrence de la chaîne search remplacée par replace.

${VAR/#search/replace}
Idem que dans le cas de
${VAR/search/replace} si ce n'est que la correspondance est testée sur la partie de tête de $VAR. [NdT: dans la continuité de l'exemple précédent avec TEXT, echo ${TEXT/#scr/scc} renverra sccipting_for_phun. Alors qu'echo ${TEXT/ipt/atch} renverra scratching_for_phun.]
${VAR/%search/replace}
Idem que dans le cas de
${VAR/search/replace} sauf que la correspondance est entreprise sur la partie finale de$VAR.

${VAR//search/replace}
Idem que dans le cas de
${VAR/search/replace} sauf que toutes les occurrences de search sont remplacées.

Développement de guillemets inverses:
(backquote expansion) Nous avons déjà rencontré un développement de ce type dans la section 8.12. Observez que la notation avec le signe additionnel $(commande) équivaut à `commande` excepté que le caractère d'échappement (\) n'est pas nécessaire pour les caractères spéciaux.

Développement arithmétique:
(ou arithmetic expansion) Nous avons déjà réalisé un développement arithmétique à au paragraphe 8.1. La notation en $((expression)) est équivalente à $[expression] vue à en 8.1.

Finalement,
la dernière modification relative à la ligne de commande est la division de la ligne de commande en mots selon les espaces qui les séparent. La variable d'environnement IFS (Internal Field Separator) détermine quel caractère sépare les mots dans une commande (usuellement, il s'agit d'un espace). Dans le cas de commandes constituées de mots, les chemins sont développés selon les caractères de remplacement globaux. Consultez bash(1) pour une description des motifs correspondant aux options que beaucoup d'utilisateurs méconnaissent.


next up previous contents Next: Commandes internes. Up: Scripts de shell avancés. Previous: Paramètres spéciaux: $?, $*,   Table des matières  
1-01-2006