Есть несколько способов приблизиться к тому, чего вы хотите достичь.
1. Используйте $ BASH_VERSION
Достаточно просто посмотреть, что в $BASH_VERSIONпеременной. Лично я бы использовал подоболочку так:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Обратите внимание, что <<<синтаксис для here-doc непереносим, если вы собираетесь использовать его с /bin/shDash в Ubuntu и может быть чем-то другим в другой системе.
Альтернативный способ - через оператор case или if. Лично я бы сделал это:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
Вероятно, ради переносимости, вы, вероятно, должны проверить, вообще ли вообще установлена такая переменная с чем-то вроде [ -n $BASH_VERSION ]
Это полностью может быть переписано как функция для использования в скрипте. Что-то длинное строчки:
#!/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
Это не однострочник, хотя это намного лучше. Качество важнее количества.
2. Проверьте, что установлено
Для этого вам нужно отфильтровать вывод apt-cache policyвроде так
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-queryможет также пригодиться с некоторой фильтрацией через awk.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Обратите внимание, что это не переносимо, поскольку, если в системе ее нет dpkgили она aptустановлена (например, RHEL или FreeBSD), это не принесет вам пользы.
3. Используйте set -e для выхода из скрипта в случае ошибки
Один из способов обойти это - просто использовать ассоциативные массивы и выходить, когда bashих нельзя использовать. set -eстрока ниже #!/bin/bashпозволит сценарию выйти, если сценарий не может использовать ассоциативный массив.
Это потребует от вас явного указания пользователю: «Эй, вам действительно нужен bash версии 4.3 или выше, иначе скрипт не будет работать». Тогда ответственность ложится на пользователя, хотя некоторые могут утверждать, что это не очень хороший подход к разработке программного обеспечения.
4. Оставь все надежды и напиши переносимые POSIX-совместимые скрипты
bashСценарии не переносимы, поскольку их синтаксис не совместим с оболочкой Bourne. Если сценарий, который вы пишете, будет использоваться в различных системах, а не только в Ubuntu, то оставьте все надежды и найдите способы использовать что-то, кроме ассоциативных массивов. Это может включать наличие двух массивов или анализ файла конфигурации. Также рассмотрите возможность перехода на другой язык, Perl или Python, где синтаксис как минимум более переносим, чем bash.
$BASH_VERSIONи$BASH_VERSINFOпеременные?