Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
---|---|---|
Indietro | Capitolo 34. Bash, versioni 2 e 3 | Avanti |
Il 27 luglio 2004, Chet Ramey ha rilasciato la versione 3 di Bash. Questo aggiornamento corregge un certo numero di errori presenti in Bash e aggiunge alcune nuove funzionalità.
Eccone alcune:
Un nuovo, più generico, operatore {a..z} per l'espansione sequenziale
.#!/bin/bash for i in {1..10} # Più semplice e più diretto di #+ for i in $(seq 10) do echo -n "$i " done echo # 1 2 3 4 5 6 7 8 9 10 # O semplicemente . . . 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 # Funziona anche al contrario. echo {3..-2} # 3 2 1 0 -1 -2 echo {X..d} # X Y Z [ ] ^ _ ` a b c d # Mostra (alcuni) caratteri ASCII compresi tra Z e a, #+ ma non fate affidamento su questo comportamento perché . . . echo {]..a} # {]..a} # Perché? |
L'operatore ${!array[@]}, che espande a tutti gli indici di un dato array.
#!/bin/bash Array=(elemento-zero elemento-uno elemento-due elemento-tre) echo ${Array[0]} # elemento-zero # Primo elemento dell'array. echo ${!Array[@]} # 0 1 2 3 # Tutti gli indici di Array. for i in ${!Array[@]} do echo ${Array[i]} # elemento-zero # elemento-uno # elemento-due # elemento-tre # # Tutti gli elementi di Array. done |
L'operatore di ricerca di corrispondenza =~ delle Espressioni Regolari all'interno del costrutto di verifica doppie parentesi quadre. (Perl possiede un operatore simile.)
#!/bin/bash variabile="Questo è un bel pasticcio." echo "$variabile" if [[ "$variabile" =~ "Q*bel*ccio*" ]] # Ricerca di corrispondenza "Regex"* con l'operatore =~ #+ inserito tra [[ doppie parentesi quadre ]]. then echo "trovata corrispondenza" # trovata corrispondenza fi * Regex: abbreviazione inglese per Regular Expressions (Espressioni Regolari) [N.d.T.] |
O, più efficacemente:
#!/bin/bash input=$1 if [[ "$input" =~ "[1-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" ]] # NNN-NN-NNNN # Dove a ogni N corrisponde una cifra. # Però quella iniziale non deve essere uno 0. then echo "Numero di Social Security." # Il NSS è stato elaborato. else echo "Non è un numero della Social Security!" # Oppure richiede un input corretto. fi |
Per altri esempi sull'uso dell'operatore =~, vedi Esempio A-29 e Esempio 18-14.
La nuova opzione set -o pipefail
è utile per il debugging delle pipe.
Quando questa opzione è impostata, l'exit status di una pipe
corrisponde all'exit status dell'ultimo comando nella pipe che ha
fallito (valore di ritorno diverso da zero), invece
che all'exit status del comando finale della pipe.
Vedi Esempio 15-39.
L'aggiornamento alla versione 3 di Bash blocca l'esecuzione di alcuni script che funzionavano con le versioni precedenti. Occorre verificare gli script critici per accertarsi che funzionino ancora! Proprio un paio di script presenti in Guida Avanzata di Scripting Bash avrebbero dovuto essere corretti (vedi Esempio A-20 e Esempio 9-4). |
L'aggiornamento di Bash alla versione 3.1 presenta un certo numero di correzioni e poche modifiche di minore importanza.
È ora consentito l'operatore += dove precedentemente era riconosciuto solamente l'operatore di assegnamento =.
a=1 echo $a # 1 a+=5 # Non funziona nelle versioni Bash precedenti alla 3.1. echo $a # 15 a+=Ciao echo $a # 15Ciao |
In questo caso, += agisce come operatore per il concatenamento di stringhe. Va notato che il suo comportamento, in questo particolare contesto, è diverso da quello nel costrutto let.
a=1 echo $a # 1 let a+=5 # Aritmetica d'interi, non concatenamento di stringa. echo $a # 6 let a+=Ciao # Non "aggiunge" niente ad a. echo $a # 6 |