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

  • Cette réponse peut-elle être élaborée pour moi? I comprendre ce que signifie la partie s/, mais quen est-il de \..*?
  • @DanijelJ Jai ajouté quelques explications. chevauchent ce que vous savez déjà, mais jai pensé que cétait mieux que de laisser de côté quelque chose que vous aviez ' t. Faites-moi savoir si cela peut vous aider.
  • Oui, cela mexplique beaucoup. Jai compris le \. Je ne pouvais tout simplement pas ' comprendre le deuxième .. Merci davoir clarifié ceci pour moi.

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *