Le 27 juillet 2004, Chet Ramey a sorti la version 3 de Bash. Cette mise à jour corrige un bon nombre de bogues dans Bash et ajoute quelques nouvelles fonctionnalités.
Voici quelques-unes des nouvelles fonctionnalités :
Un nouvel opérateur, plus général, {a..z} expansion d'accolades.
#!/bin/bash for i in {1..10} # Plus simple et direct que #+ for i in $(seq 10) do echo -n "$i " done echo # 1 2 3 4 5 6 7 8 9 10 # Ou simplement... echo {a..z} # a b c d e f g h i j k l m n o p q r s t u v w x y z echo {z..a} # z y x w v u t s r q p o n m l k j i h g f e d c b a # Fonctionne aussi à l'envers. echo {3..-2} # 3 2 1 0 -1 -2 echo {X..d} # X Y Z [ ] ^ _ ` a b c d # Montre (certains) des caractères ASCII entre Z et a, #+ mais ne vous basez pas sur ce type de comportement parce que... echo {]..a} # {]..a} # Pourquoi ?
L'opérateur ${!tableau[@]}, qui s'étend sur tous les indices d'un tableau donné.
#!/bin/bash Tableau=(élément-zéro élément-un élément-deux élément-trois) echo ${Tableau[0]} # élément-zéro # Premier élément du tableau. echo ${!Tableau[@]} # 0 1 2 3 # Tous les indices de Tableau. for i in ${!Tableau[@]} do echo ${Tableau[i]} # élément-zéro # élément-un # élément-deux # élément-trois # # Tous les éléments de Tableau. done
L'opérateur de correspondance =~ d'une expression rationnelle à l'intérieur d'une expression de tests à crochets double. (Perl a un opérateur similaire.)
#!/bin/bash variable="C'est un joyeux bazar." echo "$variable" if [[ "$variable" =~ "C*joy*za*" ]] # Opérateur d'expression rationnelle =~ à l'intérieur d'un [[ crochet double ]]. then echo "correspondance vraie" # correspondance vraie fi
Ou, de façon plus utile :
#!/bin/bash entree=$1 if [[ "$entree" =~ "[1-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" ]] # NNN-NN-NNNN # Où chaque N est un entier. # Mais, l'entier initial ne doit pas être 0. then echo "Numéro de sécurité sociale." # Traitement du NSS. else echo "Ce n'est pas un numéro de sécurité sociale !" # Ou, demandez une saisie correcte. fi
Pour d'autres exemples d'utilisation de l'opérateur =~, voir l'Exemple A.30, « Chasse aux spammeurs », Exemple 18.14, « Analyser une boîte mail », Exemple A.36, « Localise les paragraphes de division dans un fichier texte » et Exemple A.25, « Convertir en HTML ».
La nouvelle option set -o pipefail est utile pour le débogage des tubes. Si cette option est activée, alors le code de sortie d'un tube est le code de sortie de la dernière commande du tube qui a échoué (qui a renvoyé un code de sortie différent de zéro), plutôt que la dernière commande réelle du tube.
La mise à jour à la version 3 de Bash casse quelques scripts qui fonctionnaient avec les anciennes versions. Testez les scripts critiques pour vous assurer qu'ils fonctionnent toujours !
Quelques scripts du Guide ABS ont dû être corrigés (voir l'Exemple A.20, « obj-oriented: Bases de données orientées objet » et l'Exemple 9.4, « read avec délai », par exemple).
La version 3.1 de Bash introduit un certain nombre de corrections et quelques modifications mineures.
L'utilisation de l'opérateur += est maintenant autorisé à des endroits où seul l'opérateur d'affectation = était reconnu.
a=1 echo $a # 1 a+=5 # Ne fonctionnera pas avec les versions Bash précédant la 3.1. echo $a # 15 a+=Hello echo $a # 15Hello
Ici, += fonctionne comme l'opérateur de concaténation de chaîne. Notez que ce comportement dans ce contexte particulier est différent de celui d'une construction let.
a=1 echo $a # 1 let a+=5 # Arithmétique entière, plutôt que concaténation de chaînes. echo $a # 6 let a+=Hello # N' "ajoute" rien à a. echo $a # 6