Istnieje kilka sposobów na osiągnięcie tego, co chcesz osiągnąć.
1. Użyj $ BASH_VERSION
Wystarczy zobaczyć, co jest $BASH_VERSION
zmienne. Osobiście użyłbym podpowłoki tak:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Pamiętaj, że <<<
składnia dla here-doc nie jest przenośna, jeśli zamierzasz jej używać /bin/sh
, czyli Dash na Ubuntu i może być czymś innym w innym systemie
Alternatywnym sposobem jest użycie instrukcji case lub if. Osobiście zrobiłbym to:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
Prawdopodobnie ze względu na przenośność powinieneś prawdopodobnie sprawdzić, czy taka zmienna jest w ogóle ustawiona w ogóle za pomocą czegoś takiego [ -n $BASH_VERSION ]
Można to całkowicie przepisać jako funkcję do użycia w skrypcie. Coś długiego w linii:
#!/bin/bash
version_above_4(){
# check if $BASH_VERSION is set at all
[ -z $BASH_VERSION ] && return 1
# If it's set, check the version
case $BASH_VERSION in
4.*) return 0 ;;
?) return 1;;
esac
}
if version_above_4
then
echo "Good"
else
echo "No good"
fi
To nie jest jedna linijka, chociaż jest to znacznie lepsze. Jakość ponad ilość.
2. Sprawdź, co jest zainstalowane
W tym celu należy filtrować dane wyjściowe apt-cache policy
podobne
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
może się również przydać przy filtrowaniu przez awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Zauważ, że nie jest to przenośne, ponieważ jeśli nie ma go dpkg
lub nie jest apt
zainstalowane w systemie (na przykład RHEL lub FreeBSD), nic ci to nie da.
3. Użyj set -e, aby wyjść ze skryptu, jeśli wystąpi błąd
Jednym ze sposobów obejścia tego jest po prostu skorzystanie z tablic asocjacyjnych i wyjście, gdy bash
nie można ich użyć. set -e
wiersz poniżej #!/bin/bash
pozwoli skryptowi zakończyć pracę, jeśli skrypt nie może użyć tablicy asocjacyjnej.
Będzie to wymagać od użytkownika wyraźnego powiedzenia: „Hej, naprawdę potrzebujesz wersji bash 4.3 lub nowszej, w przeciwnym razie skrypt nie będzie działał”. Odpowiedzialność spoczywa na użytkowniku, choć niektórzy mogą twierdzić, że nie jest to dobre podejście do tworzenia oprogramowania.
4. Porzuć wszelką nadzieję i napisz przenośne skrypty zgodne z POSIX
bash
skrypty nie są przenośne, ponieważ ich składnia nie jest kompatybilna z powłoką Bourne'a. Jeśli skrypt, który piszesz, będzie używany w wielu różnych systemach, nie tylko w Ubuntu, porzuć wszelką nadzieję i znajdź sposoby na użycie czegoś innego niż tablice asocjacyjne. Może to obejmować dwie tablice lub parsowanie pliku konfiguracyjnego. Zastanów się także nad przejściem na inny język, Perl lub Python, gdzie składnia jest co najmniej bardziej przenośna niż bash
.
$BASH_VERSION
i$BASH_VERSINFO
?