Le 27 juillet 2004, Chet Ramey a sorti la version 3 de Bash. Cette mise à jour a corrigé un bon nombre de bogues et a ajouté quelques nouvelles fonctionnalités.
Voici quelques-unes des nouvelles fonctionnalités les plus importantes :
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" # Opérateur d'expression rationnelle =~ à l'intérieur d'un [[ crochet double ]]. if [[ "$variable" =~ "C........joy*za*" ]] # ^ ^ # NOTE: Mise entre guillemets non nécessaire à partir de la version 3.2 de Bash. 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]" ]] # ^ NOTE: Mise entre guillemets non nécessaire # à partir de la version 3.2 de Bash. # NNN-NN-NNNN (où chaque N est un chiffre). 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.31, « Chasse aux spammeurs », Exemple 18.14, « Analyser une boîte mail », Exemple A.37, « Localise les paragraphes de division dans un fichier texte » et Exemple A.26, « 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.21, « 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
C'est principalement une mise à jour corrective.
Dans la substitution de paramètres globaux, le modèle ne s'ancre plus au début de la chaîne.
L'option --wordexp désactive la substitution de processus.
L'opérateur de correspondance des expressions rationnelles =~ ne demande plus la mise entre guillemets du motif à l'intérieur de [[ ... ]].
En fait, mettre entre guillemets dans ce contexte n'est pas conseillé car cela pourrait causer un échec de l'évaluation de l'expression rationnelle. Voir la liste des bogues sur Ubuntu et Wikinerds on Bash syntax.
Avec Bash version 3.2.25(1), sur Fedora Core, la mise entre guillemets fonctionne mais ne supposez pas que cela sera le cas sur votre machine.