2013-06-12 1 views
0

Comment vérifier si une chaîne contient la version en format: numérique/format décimal dans le script shellComment peut-on vérifier si la chaîne est un numéro de version ou non

pour, par exemple, nous avons 1.2.3.5 ou 2.3.5

Que faire si nous n'avons pas de contrainte sur le nombre de caractères que nous avons ici. Il pourrait x.x.x.x ou x.x aussi bien.

+1

Une expression régulière? –

+1

Vous souciez-vous des versions -alpha, des versions RC, des versions -stable, etc.? –

+0

Espérons que votre script ne contienne pas d'adresses IP. – devnull

Répondre

1

En utilisant bash regular expressions:

echo -n "Test: " 
read i 

if [[ $i =~ ^[0-9]+(\.[0-9]+){2,3}$ ]]; 
then 
    echo Yes 
fi 

Ce accepte digits.digits.digits ou digits.digits.digits.digits

changement {2,3} pour réduire ou agrandir le nombre acceptable de .digits (ou {2,} pour "au moins 2")

  • ^ signifie début de la chaîne
  • [0-9]+ signifie au moins un chiffre
  • \. est un point
  • (...){2,3} accepte 2 ou 3 de ce qui est à l'intérieur du ()
  • $ moyens de fin de chaîne
+1

Vous pouvez utiliser '{2,}' pour supprimer la limite supérieure: 1.2.3.4.5.6.7.8 –

+0

@glennjackman Merci. Re la question, il semble être 3 ou 4 chiffres, mais, en effet, qui pourrait être * au moins * 2 (+1, les premiers) –

+0

Merci, la limite supérieure est une bonne idée –

3

Si vous utilisez bash, vous pouvez utiliser l'opérateur binaire de correspondance =~ regex, par exemple:

pax> if [[ 1.x20.3 =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] ; then echo yes ; fi 

pax> if [[ 1.20.3 =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] ; then echo yes ; fi 
yes 

Pour vos données de test particulier, l'expression rationnelle suivante fera l'affaire:

^[0-9]+(\.[0-9]+)*$ 

(un nombre suivi d'une quantité de .<number> extensions) bien que, si vous voulez traiter les cas de pointe comme 1.2-rc7 ou 4.5-special, vous aurez besoin de quelque chose un peu plus complexe.

-2

Retourner la logique: vérifier si elle contient un caractère "invalide":

$ str=1.2.3.4.5; [[ $str == *[^0-9.]* ]] && echo nope || echo yup 
yup 
$ str=123x4.5; [[ $str == *[^0-9.]* ]] && echo nope || echo yup 
nope 

wer:

$ str=123....; [[ $str == *[^0-9.]* ]] && echo nope || echo yup 
yup 
0

Et si vous êtes vraiment limité à la Bourne shell, utilisez expr:

if expr 1.2.3.4.5 : '^[0-9][.0-9]*[0-9]$' > /dev/null; then 
    echo "yep, it's a version number" 
fi 

Je suis sûr qu'il existe des solutions impliquant awk ou sed, mais cela fera .

+0

En fait, ce serait accepter « 1 ..2 ", ce qui pourrait ne pas être acceptable pour vous. –

Questions connexes