Sto scrivendo uno script che utilizza read -i
, quindi richiede Bash 4.0 o versioni successive.
Sfortunatamente, all'inizio del 2020, macOS viene fornito ancora con Bash 3.x e molti utenti del mio script utilizzeranno i Mac. Dal momento che Apple ha cambiato la shell predefinita in zsh, non ho speranza che aggiorneranno la versione in bundle.
Pertanto, voglio che il mio script rilevi se Bash è abbastanza nuovo e esca con un utile messaggio di errore che indirizza l'utente all'aggiornamento.
So di poter confrontare ${BASH_VERSION}
, ma si tratta di una stringa con un formato non numerico, potenzialmente inaffidabile. È fragile fare supposizioni al riguardo.
Qual è il modo migliore per farlo?
requireBash4() {
if <something here>; then
>&2 echo "Bash 4.0 or newer is required."
>&2 echo "Once you're upgraded, re-run this script."
exit 1
fi
}
Risposta accettata:
if ((BASH_VERSINFO >= 4)); then ...
Nota che BASH_VERSINFO
è una matrice. Come con qualsiasi array in bash, usarlo come variabile semplice si riferisce al suo 0-esimo elemento. Puoi anche usare ((BASH_VERSINFO[0] >= 4))
se lo trovi più chiaro.
E sì, questa variabile e sintassi sono supportate almeno da bash 2.0.
BASH_VERSINFO
Una variabile di matrice di sola lettura i cui membri contengono informazioni sulla versione
per questa istanza di bash. I valori assegnati ai membri dell'array
sono i seguenti:
BASH_VERSINFO[0]
Il numero di versione principale (la versione).BASH_VERSINFO[1]
Il numero di versione secondaria (la versione).BASH_VERSINFO[2]
Il livello della patch.BASH_VERSINFO[3]
La versione build.BASH_VERSINFO[4]
Lo stato del rilascio (ad es. beta1).BASH_VERSINFO[5]
Il valore di MACHTYPE
.