Je dois tester si le numéro de version de Bash est> = à un numéro spécifique. Par exemple, j'ai:
$ 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.
Pour utiliser des tableaux associatifs, le numéro de version bash doit être> = 4.
Dans mon script bash, j'aimerais faire un test à une ligne de la manière la plus élégante / efficace / lisible possible, mais d'autres approches sont également acceptées.
command-line
bash
scripts
versions
WinEunuuchs2Unix
la source
la source
$BASH_VERSION
et$BASH_VERSINFO
?--version
et en testant la sortie était l'intention initiale. J'ai modifié la question en conséquence.Réponses:
Essayer:
BASH_VERSINFO
est une variable de tableau en lecture seule dont les membres détiennent des informations de version pour cette instance de bash. Depuis qu'il a été introduit avec bash 2.0, il est probablement pris en charge par toutes les versions de bash que vous rencontrerez. Mais, pour être prudent, nous incluons une valeur par défaut de0
pour toute version antérieure bash pour laquelle cette variable n'est pas définie.Extraire les informations de version à partir d'autres programmes
Vous avez posé des questions sur LibreOffice, Python, le noyau, etc.
LibreOffice produit des informations de version qui ressemblent à:
Pour extraire le numéro de version:
Pour python:
Pour obtenir la version du noyau, utilisez
uname
:la source
uname -r
"4.9.0-2-amd64" pourrait être supérieur au mien "4.11.1-041101-generic" avec un test bash normal alors qu'en réalité mon numéro de version est supérieur.$ python --version
lequel retournePython 2.7.12
. @ wjandrea-- merci pour le lien +1. Je pourrais peut-être construire un tableau de tous les noms de programme appelés et les numéros de version minimaux. Passez ensuite le tableau à une copie modifiée dupython
lien que vous avez fourni. Parce que seul Python compilé peut être appelé pargrub
vous pensez qu'un binaire existe pour faire ceci ou son possible dans le shell.Au lieu de comparer les numéros de version, vous pouvez tester directement la fonctionnalité elle-même.
declare -A
renvoie2
(au moins dans Bash 3.2) s'il ne reconnaît pas-A
, alors testez cela (il affiche également une erreur):(
declare -A var
échoue également s'ilvar
s'agit d'un tableau non associatif,unset
il le fait donc en premier.)Bien que je ne suppose pas que quiconque va rétroporter des fonctionnalités dans Bash, en général, il est plus approprié de vérifier les fonctionnalités, pas les versions. Même dans le cas de Bash, quelqu'un pourrait compiler une version avec seulement des fonctionnalités limitées ...
Le cas plus général de test des numéros de version comporte deux parties: 1) comment trouver le numéro de version correct à tester, et 2) comment le comparer à une autre valeur.
Le premier est le plus difficile. De nombreux programmes indiquent leur numéro de version avec un indicateur de ligne de commande comme
--version
ou-v
, mais le format de sortie varie et il peut être difficile de choisir le numéro de version par programme. Ensuite, il y a la possibilité d'avoir plusieurs versions du même programme installées en même temps.La seconde dépend d'une certaine connaissance du format des numéros de version.
dpkg
peut comparer les numéros de version de style Debian (qui, je pense, inclut des versions de type semver comme sous-ensemble):Ou, juste pour combiner ce qui précède:
la source
Il y a deux façons d'aborder ce que vous voulez réaliser.
1. Utilisez $ BASH_VERSION
Il suffit juste de voir ce qui est
$BASH_VERSION
variable. Personnellement, j'utiliserais un sous-shell comme ceci:Notez que la
<<<
syntaxe pour here-doc n'est pas portable, si vous allez l'utiliser avec/bin/sh
, qui est Dash sur Ubuntu et pourrait être autre chose sur un système différentVous pouvez également utiliser la déclaration de cas ou la déclaration if. Personnellement, je ferais ceci:
Probablement pour des raisons de portabilité, vous devriez probablement vérifier si une telle variable est même définie en premier lieu avec quelque chose comme
[ -n $BASH_VERSION ]
Cela peut totalement être réécrit en fonction à utiliser dans un script. Quelque chose de long les lignes de:
Ce n'est pas un monoplace, bien que ce soit beaucoup mieux. La qualité plutôt que la quantité.
2. Vérifiez ce qui est installé
Pour cela, vous devez filtrer la sortie de la
apt-cache policy
sortedpkg-query
peut également être utile avec un filtrage viaawk
.Notez que ce n'est pas portable, car s'il n'y en a pas
dpkg
ouapt
installé sur un système (par exemple, RHEL ou FreeBSD), cela ne vous fera aucun bien.3. Utilisez set -e pour quitter le script en cas d'erreur
Une façon de le contourner consiste simplement à utiliser des tableaux associatifs et à quitter lorsque
bash
vous ne pouvez pas les utiliser.set -e
la ligne ci#!/bin/bash
- dessous permettra au script de se fermer si le script ne peut pas utiliser de tableau associatif.Cela vous demandera de dire explicitement à l'utilisateur: "Hé, vous avez vraiment besoin de la version 4.3 ou supérieure de bash, sinon le script ne fonctionnera pas". Ensuite, la responsabilité incombe à l'utilisateur, même si certains pourraient affirmer que ce n'est pas vraiment une bonne approche pour le développement de logiciels.
4. Abandonnez tout espoir et écrivez des scripts portables, compatibles POSIX
bash
les scripts ne sont pas portables car sa syntaxe n'est pas compatible avec le shell Bourne. Si le script que vous écrivez va être utilisé sur une gamme de systèmes différents, pas seulement Ubuntu seul, alors abandonnez tout espoir et trouvez des moyens d'utiliser autre chose que des tableaux associatifs. Cela peut inclure la présence de deux tableaux ou l'analyse d'un fichier de configuration. Pensez également à passer à un autre langage, Perl ou Python, où la syntaxe est au moins plus portable quebash
.la source
yad --version
retourne0.37.0 (GTK+ 3.18.9)
mais de nouvelles fonctionnalités sont actuellement disponibles0.39
.One-liner pas possible mais un script bash est possible
J'ai développé un script qui s'appuie sur les réponses dans Stack Overflow. L'une de ces réponses a conduit à une comparaison des numéros de version des employés Dell en 2004 pour l'application DKMS.
Le code
Le script bash ci-dessous doit être marqué comme exécutable à l'aide de la commande
chmod a+x script-name
. J'utilise le nom/usr/local/bin/testver
:la source