Next: Commandes internes.
Up: Scripts de shell avancés.
Previous: Paramètres spéciaux: $?, $*,
Table des matières
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
caractère de $VAR et les l
caractères suivants. Si l n'est pas stipulé, tous les caractères
à la droite du n
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: Commandes internes.
Up: Scripts de shell avancés.
Previous: Paramètres spéciaux: $?, $*,
Table des matières
1-01-2006