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