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 {e..m} # e f g h i j k l m 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 {25..30} # 25 26 27 28 29 30 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 ? # On peut rajouter des préfixes ou des suffixes. You can tack on prefixes and suffixes. echo "Numéro #"{1..4}, "..." # Numéro #1, Numéro #2, Numéro #3, Numéro #4, ... # On peut concaténer des résultats d'expressions entre accolades. echo {1..3}{x..z}" +" "..." # 1x + 1y + 1z + 2x + 2y + 2z + 3x + 3y + 3z + ... # Génère une expression algébrique. # Utile pour trouver les permutations. # On peut imbriquer des résultats d'expressions entre accolades. echo {{a..c},{1..3}} # a b c 1 2 3 # L'opérateur virgule colle les chaînes de caractères. # ########## ######### ############ ########### ######### ############### # Malheureusement, le développement des accolades ne se prête pas #+ bien à la paramétrisation. var1=1 var2=5 echo {$var1..$var2} # {1..5} # Cependant, comme le remarque Emiliano G., l'utilisation d'"eval" #+ permet de surmonter cette limitation. debut=0 fin=10 for index in $(eval echo {$debut..$fin}) do echo -n "$index " # 0 1 2 3 4 5 6 7 8 9 10 done echo
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 =~ entre [[ crochets doubles ]]. if [[ "$variable" =~ C........joy*za* ]] # ^ ^ # NOTE: À partir de la version 3.2 de Bash, l'expression à rechercher #+ ne se met plus entre guillemets then echo "correspondance vraie" # correspondance vraie fi
Ou, de façon plus utile :
#!/bin/bash entree=$1 if [[ "$entree" =~ "[0-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.29, « Chasse aux spammeurs », Exemple 19.14, « Analyser une boîte mail », Exemple A.35, « Localise les paragraphes divisés dans un fichier texte » et Exemple A.24, « 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 9.4, « Lecture 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
Jeffrey Haemer remarque que cet opérateur de concaténation peut être très utile. Dans l'exemple suivant, nous ajoutons un répertoire au $PATH.
bash$ echo $PATH /usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin/:/usr/games bash$ PATH+=:/opt/bin bash$ echo $PATH /usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin/:/usr/games:/opt/bin
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 entre [[ ... ]].
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. Dans la FAQ de Bash, Chet Ramey explique en effet que la mise entre guillements désactive explicitement l'évaluation de l'expression régulière. Voir aussi la liste des bogues sur Ubuntu et Wikinerds on Bash syntax.
Mettre shopt -s compat31 dans un script provoque le retour au comportement précédent.