Existem algumas maneiras de abordar o que você deseja alcançar.
1. Use $ BASH_VERSION
É suficiente apenas ver o que está na $BASH_VERSION
variável. Pessoalmente, eu usaria o subshell assim:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Observe que a <<<
sintaxe do here-doc não é portátil, se você a usar /bin/sh
, que é o Dash no Ubuntu e pode ser outra coisa em um sistema diferente
A maneira alternativa é via declaração de caso ou declaração de caso. Pessoalmente, eu faria isso:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
Provavelmente, por uma questão de portabilidade, você provavelmente deve verificar se essa variável está definida, em primeiro lugar, com algo como [ -n $BASH_VERSION ]
Isso totalmente pode ser reescrito como função a ser usada em um script. Algo longo as linhas de:
#!/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
Esta não é uma linha, embora isso seja muito melhor. Qualidade acima de quantidade.
2. Verifique o que está instalado
Para isso, você precisa filtrar a saída da apt-cache policy
mesma forma
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
também pode ser útil com alguns filtros via awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Observe que isso não é portátil, pois se não houver dpkg
ou estiver apt
instalado em um sistema (por exemplo, RHEL ou FreeBSD), não fará nenhum bem.
3. Use set -e para sair do script se houver um erro
Uma maneira de contornar isso é simplesmente ir em frente e usar matrizes associativas e sair quando bash
não puder usá-las. set -e
A linha abaixo #!/bin/bash
permitirá que o script seja encerrado se o script não puder usar matriz associativa.
Isso exigirá que você informe explicitamente ao usuário: "Ei, você realmente precisa do bash versão 4.3 ou superior, caso contrário, o script não funcionará". A responsabilidade é do usuário, embora alguns possam argumentar que essa não é realmente uma boa abordagem para o desenvolvimento de software.
4. Abandone toda a esperança e escreva scripts portáteis, compatíveis com POSIX
bash
scripts não são portáveis porque sua sintaxe não é compatível com o shell Bourne. Se o script que você está escrevendo for usado em uma variedade de sistemas diferentes, não apenas no Ubuntu, abandone toda a esperança e encontre maneiras de usar algo diferente de matrizes associativas. Isso pode incluir ter duas matrizes ou analisar um arquivo de configuração. Considere também mudar para uma linguagem diferente, Perl ou Python, onde a sintaxe é pelo menos mais portátil que bash
.
$BASH_VERSION
e$BASH_VERSINFO
?