Ada beberapa cara untuk mendekati apa yang ingin Anda capai.
1. Gunakan $ BASH_VERSION
Cukup hanya dengan melihat apa yang ada di $BASH_VERSION
variabel. Secara pribadi saya akan menggunakan subkulit seperti:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Perhatikan bahwa <<<
sintaks untuk sini-doc tidak portabel, jika Anda akan menggunakannya /bin/sh
, yaitu Dash pada Ubuntu dan mungkin sesuatu yang lain pada sistem yang berbeda
Cara alternatif adalah melalui pernyataan kasus atau pernyataan jika. Secara pribadi, saya akan melakukan ini:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
Mungkin demi portabilitas, Anda mungkin harus memeriksa apakah variabel tersebut bahkan diset sama sekali di tempat pertama dengan sesuatu seperti [ -n $BASH_VERSION ]
Ini sepenuhnya dapat ditulis ulang sebagai fungsi yang akan digunakan dalam skrip. Sesuatu yang panjang dalam garis-garis:
#!/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
Ini bukan satu-liner, meskipun ini jauh lebih baik. Kualitas diatas kuantitas.
2. Periksa apa yang diinstal
Untuk itu Anda perlu memfilter keluaran apt-cache policy
sejenisnya
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
juga dapat berguna dengan beberapa penyaringan via awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Perhatikan bahwa ini tidak portabel, karena jika tidak ada dpkg
atau apt
diinstal pada sistem (misalnya, RHEL atau FreeBSD), itu tidak akan ada gunanya bagimu.
3. Gunakan set -e untuk keluar dari skrip jika ada kesalahan
Salah satu cara untuk menyiasatinya hanyalah dengan menggunakan array asosiatif dan berhenti ketika bash
tidak dapat menggunakannya. set -e
baris di bawah ini #!/bin/bash
akan memungkinkan skrip untuk berhenti jika skrip tidak dapat menggunakan array asosiatif.
Ini akan mengharuskan Anda untuk memberi tahu pengguna secara eksplisit: "Hei, Anda benar-benar membutuhkan bash versi 4.3 atau lebih baru, jika tidak skrip tidak akan berfungsi". Kemudian tanggung jawab terletak pada pengguna, meskipun beberapa orang mungkin berpendapat bahwa ini bukan pendekatan yang baik untuk pengembangan perangkat lunak.
4. Abaikan semua harapan dan tulis skrip portabel yang sesuai dengan POSIX
bash
skrip tidak portabel karena sintaksisnya tidak kompatibel dengan Bourne shell. Jika skrip yang Anda tulis akan digunakan pada berbagai sistem yang berbeda, bukan hanya Ubuntu saja, tinggalkan semua harapan, dan temukan cara untuk menggunakan sesuatu selain array asosiatif. Itu mungkin termasuk memiliki dua array atau parsing file konfigurasi. Pertimbangkan juga beralih ke bahasa lain, Perl atau Python, di mana sintaks setidaknya lebih portabel daripada bash
.
$BASH_VERSION
dan$BASH_VERSINFO
?