Extension du shell bash
L'une des opérations du shell lorsqu'il analyse l'entrée est l'expansion du shell. Bash fournit différents types d'expansion. Dans cet article, passons en revue une extension importante - "l'extension de l'accolade".
Cet article fait partie de notre série de tutoriels Bash en cours.
Extension de l'accolade
L'expansion des accolades est utilisée pour générer des chaînes arbitraires. L'expansion des accolades vous permet de créer plusieurs arguments de ligne de commande modifiés à partir d'un seul argument. Les chaînes spécifiées sont utilisées pour générer toutes les combinaisons possibles avec les préambules et postscripts facultatifs environnants. Le préambule est préfixé à chaque chaîne contenue dans les accolades, et le post-scriptum est ensuite ajouté à chaque chaîne résultante, se développant de gauche à droite.
$ echo last{mce,boot,xorg}.log lastmce.log lastboot.log lastxorg.log where last is Preamble and .log is the postscript
L'instruction echo ci-dessus vous évite de spécifier les trois fichiers journaux séparément. Si vous souhaitez afficher le contenu du dernier journal de démarrage, du journal mce et du journal xorg, vous pouvez utiliser l'expansion des accolades comme indiqué dans l'instruction echo ci-dessus.
1. Exemple de sauvegarde utilisant l'expansion des accolades
$ cat bkup.sh set -x # expand the commands da=`date +%F` cp $da.log{,.bak} $ ./bkup.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log 2010-05-28.log.bak
Dans le script de sauvegarde ci-dessus, il copie le fichier journal de la date actuelle avec l'extension .bak. Le premier élément est vide entre accolades, donc le premier élément n'aura qu'un préambule.
2. Exemple de restauration à l'aide de l'expansion des accolades
$ cat restore.sh set -x # expand the commands da=`date +%F` cp $da.log{.bak,} $ ./restore.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log.bak 2010-05-28.log
Dans le script de restauration, le premier élément du paramètre est .bak où le deuxième élément est vide.
Reportez-vous également à notre article précédent sur les fonctions du shell bash pour une lecture supplémentaire.
3. Exemple pour Brace Expansion sans préambule ni post-scriptum
S'il n'y a pas de préambule et de post-scriptum, il développe simplement les éléments donnés entre accolades.
$ cat expand.sh echo {oct,hex,dec,bin} $ ./expand.sh oct hex dec bin
Sans les chaînes facultatives de préambule et de post-scriptum, le résultat est simplement une liste séparée par des espaces des chaînes données
Extension des accolades pour les plages
L'expansion des accolades étend également les séquences. Les séquences peuvent être des nombres entiers ou des caractères.
4. Exemple de séquences d'entiers et de caractères
$ cat sequence.sh cat /var/log/messages.{1..3} echo {a..f}{1..9}.txt $ ./sequence.sh May 9 01:18:29 x3 ntpd[2413]: time reset -0.132703 s May 9 01:22:38 x3 ntpd[2413]: synchronized to LOCAL(0), stratum 10 May 9 01:23:44 x3 ntpd[2413]: synchronized to May 9 01:47:48 x3 dhclient: DHCPREQUEST on eth0 May 9 01:47:48 x3 dhclient: DHCPACK from 23.42.38.201 .. .. a1.txt a2.txt a3.txt a4.txt b1.txt b2.txt b3.txt b4.txt c1.txt c2.txt c3.txt c4.txt
La première commande cat développe messages.1, messages.2 et messages.3 et affiche le contenu. et dans l'instruction d'écho suivante, les séquences de caractères et d'entiers sont combinées et utilisées.
Séquences avec valeur d'incrément
Dans l'expansion des accolades kshell, vous pouvez utiliser la valeur d'incrémentation pour générer les séquences.
Syntax: <start>..<end>..<incr>
incr est numérique. Vous pouvez utiliser un entier négatif, mais le signe correct est déduit de l'ordre de début et de fin.
5. Exemple d'utilisation de l'incrémentation dans les séquences
$ ksh $ echo /var/log/messages.{1..7..2} /var/log/messages.1 /var/log/messages.3 /var/log/messages.5 /var/log/messages.7 $
En utilisant cela, vous pouvez voir les fichiers journaux des jours alternatifs.
Piège dans l'extension Brace
L'expansion des accolades ne développe pas les variables bash, car l'expansion des accolades est la toute première étape de l'expansion du shell, la variable sera développée plus tard.
6. Exemple pour Variables en expansion
Si vous voyez la sortie des deux instructions for suivantes, vous pouvez identifier le piège ci-dessus.
$ cat var_seq.sh # Print 1 to 4 using sequences. for i in {1..4} do echo $i done start=1 end=4 # Print 1 to 4 using through variables echo "Sequences expressed using variables" for i in {$start..$end} do echo $i done $ ./var_seq.sh 1 2 3 4 Sequences expressed using variables {1..4}