<Precedenti | Contenuti | Succ.>
Una versione più moderna del test
Versioni recenti di bash includere un comando composto che agisce come una sostituzione migliorata per testUtilizza la seguente sintassi:
[[ espressione ]]
dove, come test, espressione è un'espressione che restituisce un risultato vero o falso. [[]] il comando è molto simile a test (supporta tutte le sue espressioni), ma
aggiunge una nuova importante espressione stringa:
string1 =~ regex
che restituisce true se string1 corrisponde all'espressione regolare estesa regexQuesto apre molte possibilità per eseguire attività come la convalida dei dati. Nel nostro precedente esempio di espressioni intere, lo script fallirebbe se la costante INT conteneva qualsiasi cosa tranne un numero intero. Lo script ha bisogno di un modo per verificare che la costante contenga un numero intero. Utilizzando [[]] con la =~ operatore di espressione stringa, potremmo migliorare lo script in questo modo:
#! / Bin / bash
# test-integer2: valuta il valore di un numero intero.
INT=-5
se [[ "$INT" =~ ^-?[0-9]+$ ]]; allora
if [ $INT -eq 0 ]; then echo "INT è zero."
altro
if [ $INT -lt 0 ]; then echo "INT è negativo."
altro
echo "INT è positivo."
fi
if [ $((INT % 2)) -eq 0 ]; then echo "INT è pari."
altro
echo "INT è dispari."
fi
fi
altro
echo "INT non è un numero intero." >&2 uscita 1
fi
#! / Bin / bash
# test-integer2: valuta il valore di un numero intero.
INT=-5
se [[ "$INT" =~ ^-?[0-9]+$ ]]; allora
if [ $INT -eq 0 ]; then echo "INT è zero."
altro
if [ $INT -lt 0 ]; then echo "INT è negativo."
altro
echo "INT è positivo."
fi
if [ $((INT % 2)) -eq 0 ]; then echo "INT è pari."
altro
echo "INT è dispari."
fi
fi
altro
echo "INT non è un numero intero." >&2 uscita 1
fi
Applicando l'espressione regolare, siamo in grado di limitare il valore di INT solo alle stringhe che iniziano con un segno meno facoltativo, seguito da uno o più numeri. Questa espressione elimina anche la possibilità di valori vuoti.
Un'altra caratteristica aggiunta di [[]] è che l' == L'operatore supporta la corrispondenza dei pattern allo stesso modo dell'espansione del percorso. Ad esempio:
[io@linuxbox~]$ FILE=foo.bar
[io@linuxbox~]$ FILE=foo.bar
Una versione più moderna del test
[io@linuxbox~]$ se [[ $FILE == foo.* ]]; allora
> echo "$FILE corrisponde al modello 'foo.*'"
> fi
foo.bar corrisponde al modello 'foo.*'
[io@linuxbox~]$ se [[ $FILE == foo.* ]]; allora
> echo "$FILE corrisponde al modello 'foo.*'"
> fi
foo.bar corrisponde al modello 'foo.*'
Questo rende [[]] utile per valutare i nomi dei file e dei percorsi.