Píšu skript, který používá read -i
, takže vyžaduje Bash 4.0 nebo novější.
Bohužel od začátku roku 2020 se macOS stále dodává s Bash 3.x a mnoho uživatelů mého skriptu bude používat Mac. Protože Apple změnil výchozí shell na zsh, nemám naději, že aktualizuje přibalenou verzi.
Proto chci, aby můj skript zjistil, zda je Bash dostatečně nový, a skončil s užitečnou chybovou zprávou, která uživatele nasměruje k upgradu.
Vím, že mohu porovnat ${BASH_VERSION}
, ale to je řetězec s nenumerickým, potenciálně nespolehlivým formátem. Je křehké dělat si o tom domněnky.
Jaký je nejlepší způsob, jak toho dosáhnout?
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
}
Přijatá odpověď:
if ((BASH_VERSINFO >= 4)); then ...
Všimněte si, že BASH_VERSINFO
je pole. Stejně jako u jakéhokoli pole v bash, jeho použití jako prosté proměnné odkazuje na jeho 0-tý prvek. Můžete také použít ((BASH_VERSINFO[0] >= 4))
pokud vám to přijde jasnější.
A ano, tato proměnná a syntaxe jsou podporovány minimálně od bash 2.0.
BASH_VERSINFO
Proměnná pole pouze pro čtení, jejíž členové obsahují informace o verzi
pro tuto instanci bash. Hodnoty přiřazené členům pole
jsou následující:
BASH_VERSINFO[0]
Hlavní číslo verze (vydání).BASH_VERSINFO[1]
Číslo vedlejší verze (verze).BASH_VERSINFO[2]
Úroveň opravy.BASH_VERSINFO[3]
Verze sestavení.BASH_VERSINFO[4]
Stav vydání (např. beta1).BASH_VERSINFO[5]
HodnotaMACHTYPE
.