Voici ce que jutilise actuellement pour tester la version de Debian. Au lieu de le faire de cette façon, puis-je le rendre plus succinct?
#!/bin/bash VERSION=NONE if [ $(cat /etc/debian_version) == "7.3" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.2" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.1" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.0" ]; then VERSION=7 fi
Je sais que ce nest pas la manière la plus attrayante de faire cela. Ce que je veux, cest comprendre comment utiliser le fichier à /etc/debian_version
pour lire le numéro de version avant le .
et ignorer le numéro après.
Jai essayé dutiliser
if [ $(cat /etc/debian_version) == "7.*" ]; then
et jai aussi essayé
if [ $(cat /etc/debian_version) == "7.2|7.1|7.0" ]; then
Mais ni lun ni lautre na fonctionné pour moi. Je veux assurer la pérennité de mon script afin que si Debian 7.4 est publié, alors je naurai pas à revenir sur tous les scripts qui reposent sur cela et à les modifier
Je connais également le lsb_release -a
me montrant les informations relatives, je ne sais pas comment « couper » ce que je veux de cela et vérifier que cest Debian 6 ou 7. Le script original, comme vous pouvez limaginer , est assez long.
Tout autre message que vous pouvez me signaler serait également apprécié dutiliser la méthode de « découpage » de la réponse pour ne sectionner que la partie que je veux.
Réponse
Il existe de nombreuses façons de faire ce que vous voulez. Celui-ci supprime simplement le point décimal et tout ce qui suit du numéro de version:
VERSION=$(sed "s/\..*//" /etc/debian_version)
\..*
signifie un point ( \.
) suivi de zéro ou plus de nimporte quel caractère (.*
). Ainsi, pour sed
, lexpression s/\..*//
signifie remplacer le point et tout ce qui suit par rien. Le résultat de la commande sed
est enregistré dans la variable denvironnement VERSION
.
Ce qui précède élimine le besoin de instructions if / then / elif /…/ fi. Il fonctionnera à la fois avec bash et ordinaire / bin / sh.
PLUS: sed
est un éditeur de flux: cela signifie quil lit les lignes de stdin, les édite selon les instructions et (généralement) les envoie à stdout. Dans ce cas, nous lui donnons une instruction «de substitution». Par exemple, s/foo/bar/
signifie trouver la première occurrence de foo et la remplacer par bar. Dans un cas particulier, s/foo//
signifie remplacer foo
par rien. Dans notre cas, nous voulons remplacer un point suivi de nimporte quel caractère par rien. Maintenant, un point est « . » sauf que sed
traite normalement un point comme signifiant « nimporte quel caractère ». Donc, nous devons «léchapper» en mettant une barre oblique inverse devant lui. Lorsque sed
voit \.
, il sait que nous voulons dire une période littérale. Nous voulons également effacer tous les caractères suivant la période. Pour représenter « nimporte quel caractère », nous utilisons un point .
(sans échappement). Pour être général, cependant, nous voulons supprimer tous les caractères suivant le point, quel que soit leur nombre. Ainsi, alors que dans la langue de sed
« , un point signifie nimporte quel caractère, létoile signifie » nimporte quel nombre du caractère précédent « (qui pourrait être zéro). Ainsi period-star .*
signifie zéro ou plus de nimporte quel caractère. Donc, en mettant tout cela ensemble, s/\..*//
dit sed
que sil trouve un point, éventuellement suivi de quelque chose, alors remplacez-le par rien.
Commentaires
Réponse
Voici « une solution qui utilise bash, pas dutilitaires externes , et est un seul appel
read -d . VERSION < /etc/debian_version
Cela lit /etc/debian_version
, divise lentrée sur la période (.
), assigne tout avant le point à VERSION
et supprime tout après.
IFS="." read VERSION VERSION_MINOR < /etc/debian_version
Ceci est légèrement différent en ce quil enregistre tout après la période dans VERSION_MINOR
IFS="." read -a VERSION < /etc/debian_version
Celui-ci est le plus puissant en cela il se divise sur la période et affecte le tableau $VERSION
. Si la version est 1.2.3
alors ${VERSION[0]} == 1
${VERSION[1]} == 2
et ${VERSION[2]} == 3
.
Commentaires
- Cest excellent!Je ' je nai jamais vu de lecture utilisée comme ça!
Réponse
case `cat /etc/debian_version` in 7*) VERSION=7;; *) VERSION=NONE;; esac
Ceci peut être étendu pour reconnaître plus de versions, bien sûr.
s/
, mais quen est-il de\..*
?\.
Je ne pouvais tout simplement pas ' comprendre le deuxième.
. Merci davoir clarifié ceci pour moi.