Existem algumas maneiras de abordar o que você deseja alcançar.
1. Use $ BASH_VERSION
É suficiente apenas ver o que está na variável $BASH_VERSION
. Pessoalmente eu usaria subshell assim:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Note que a sintaxe <<<
para o here-doc não é portátil, se você for usá-lo com /bin/sh
, que é o Dash no Ubuntu e pode ser algo diferente em um sistema diferente
O caminho alternativo é via declaração de caso ou declaração if. 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 pode ser totalmente reescrito como função para ser usado 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
Este não é um one-liner, embora seja muito melhor. Qualidade sobre a quantidade.
2. Verifique o que está instalado
Para isso, você precisa filtrar a saída de apt-cache policy
da mesma forma
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
também pode ser útil com alguma filtragem via awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Note que isto não é portátil, uma vez que se não houver dpkg
ou apt
instalado em um sistema (por exemplo, RHEL ou FreeBSD), não fará nenhum bem a você.
3. Use set -e para sair do script se houver um erro
Uma maneira de contornar isso é simplesmente ir em frente usando matrizes associativas de uso e sair quando bash
não puder usá-las. set -e
linha abaixo de #!/bin/bash
permitirá que o script seja encerrado se o script não puder usar matriz associativa.
Isso exigirá que você diga explicitamente ao usuário: "Ei, você realmente precisa do bash versão 4.3 ou acima, caso contrário o script não funcionará". Então, a responsabilidade cabe ao 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
Os scripts
bash
não são portáteis porque sua sintaxe não é compatível com o shell Bourne. Se o script que você está escrevendo for usado em vários 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 alternar para um idioma diferente, Perl ou Python, em que a sintaxe é pelo menos mais portável que bash
.