Saya perlu menguji apakah nomor versi Bash>> ke nomor tertentu. Misalnya saya punya:
$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Untuk menggunakan array asosiatif, nomor versi bash harus>> 4.
Dalam skrip bash saya, saya ingin melakukan tes satu-liner dengan cara yang paling elegan / efisien / mudah dibaca, tetapi pendekatan lain juga diterima.
command-line
bash
scripts
versions
WinEunuuchs2Unix
sumber
sumber
$BASH_VERSION
dan$BASH_VERSINFO
?--version
dan menguji output adalah niat asli. Saya telah mengedit pertanyaan sesuai.Jawaban:
Mencoba:
BASH_VERSINFO
adalah variabel array hanya baca yang anggotanya memegang informasi versi untuk instance bash ini. Karena ini diperkenalkan dengan bash 2.0, kemungkinan didukung oleh semua versi bash yang akan Anda temui. Namun, untuk berhati-hati, kami menyertakan nilai default sebesar0
untuk setiap versi bash sebelumnya yang variabel ini tidak disetel.Mengekstraksi informasi versi dari program lain
Anda bertanya tentang LibreOffice, Python, kernel, dll.
LibreOffice menghasilkan informasi versi yang terlihat seperti:
Untuk mengekstrak nomor versi:
Untuk python:
Untuk mendapatkan versi kernel, gunakan
uname
:sumber
uname -r
adalah "4.9.0-2-amd64" yang dapat menguji lebih besar dari milik saya "4.11.1-041101-generic" dengan tes bash reguler ketika kenyataannya nomor versi saya lebih besar.$ python --version
yang mengembalikanPython 2.7.12
. @ wjandrea-- terima kasih untuk tautan +1. Mungkin saya bisa membuat tabel semua nama program dan nomor versi minimal. Kemudian, berikan tabel ke salinan yang dimodifikasi daripython
tautan yang Anda berikan. Karena hanya Python yang dikompilasi yang dapat dipanggil olehgrub
Anda akan berpikir biner ada untuk melakukan ini atau kemungkinan dalam shell.Alih-alih membandingkan nomor versi, Anda dapat menguji langsung fitur itu sendiri.
declare -A
mengembalikan2
(setidaknya dalam Bash 3.2) jika tidak dikenali-A
, jadi uji untuk itu (juga mencetak kesalahan):(
declare -A var
juga gagal jikavar
array non-asosiatif, jadiunset
yang pertama.)Meskipun saya tidak benar-benar berasumsi siapa pun akan mendukung fitur di Bash, secara umum lebih tepat untuk memeriksa fitur, bukan versi. Bahkan dalam kasus Bash, seseorang mungkin mengompilasi versi dengan hanya fitur terbatas ...
Kasus yang lebih umum dari pengujian nomor versi memiliki dua bagian: 1) bagaimana menemukan nomor versi yang benar untuk diuji, dan 2) bagaimana membandingkannya dengan nilai lain.
Yang pertama adalah yang lebih sulit. Banyak program memberi tahu nomor versi mereka dengan bendera baris perintah seperti
--version
atau-v
, tetapi format output bervariasi dan secara terprogram memilih nomor versi mungkin sulit. Lalu ada masalah kemungkinan beberapa versi dari program yang sama diinstal pada waktu yang sama.Yang kedua tergantung pada beberapa pengetahuan tentang format nomor versi.
dpkg
dapat membandingkan nomor versi gaya-Debian (yang saya pikir menyertakan versi jenis semver sebagai subset):Atau, cukup dengan menggabungkan di atas:
sumber
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: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 berbedaCara alternatif adalah melalui pernyataan kasus atau pernyataan jika. Secara pribadi, saya akan melakukan ini:
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:
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
sejenisnyadpkg-query
juga dapat berguna dengan beberapa penyaringan viaawk
.Perhatikan bahwa ini tidak portabel, karena jika tidak ada
dpkg
atauapt
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 daripadabash
.sumber
yad --version
mengembalikan0.37.0 (GTK+ 3.18.9)
tetapi fitur baru sedang dalam0.39
.Satu baris tidak mungkin tetapi skrip bash dimungkinkan
Saya mengembangkan skrip yang mengacu pada jawaban di Stack Overflow. Salah satu jawaban itu mengarah ke perbandingan nomor versi Karyawan Dell pada tahun 2004 untuk aplikasi DKMS.
Kode
Skrip bash di bawah ini harus ditandai sebagai dapat dieksekusi menggunakan perintah
chmod a+x script-name
. Saya menggunakan namanya/usr/local/bin/testver
:sumber