Есть несколько способов приблизиться к тому, чего вы хотите достичь.
1. Используйте $ BASH_VERSION
Достаточно просто посмотреть, что в $BASH_VERSION
переменной. Лично я бы использовал подоболочку так:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Обратите внимание, что <<<
синтаксис для here-doc непереносим, если вы собираетесь использовать его с /bin/sh
Dash в 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
переменные?