Script shell - valider la nature d'un nombre [Résolu]

charline159 65 Messages postés lundi 14 août 2017Date d'inscription 28 octobre 2017 Dernière intervention - 17 août 2017 à 10:58 - Dernière réponse : charline159 65 Messages postés lundi 14 août 2017Date d'inscription 28 octobre 2017 Dernière intervention
- 17 août 2017 à 18:11
Bonjour! J'ai un petit soucis sur un script shell:

#!/bin/bash

if [ $# -ne 1 ]
then
echo "Veuillez rentrer un chiffre ou nombre en paramètre!"
elif [ $1 -eq 10 ]
then
echo "parfait!"
elif [ $1 -gt 10 ]
then
echo "c'est trop!"
else
echo "ce n'est pas assez!"
fi


Si je tape mon script avec une lettre en paramètre, ça plante.
Comment faire pour que la condition admette qu'il faut nécessairement un chiffre/un nombre en paramètre, et non des lettres?

Merci pour votre aide!

Afficher la suite 
65Messages postés lundi 14 août 2017Date d'inscription 28 octobre 2017 Dernière intervention

18 réponses

Répondre au sujet
Exileur 1127 Messages postés mercredi 31 août 2011Date d'inscription 14 septembre 2017 Dernière intervention - 17 août 2017 à 11:30
0
Utile
17
Salut,

Il faut que tu utilises les expressions régulière (regex).

reg='^[0-9]+$'
if ! [[ $yournumber =~ $reg ]] ; then
echo "error: Not a number"
fi

A plus dans l'bus
charline159 65 Messages postés lundi 14 août 2017Date d'inscription 28 octobre 2017 Dernière intervention - 17 août 2017 à 15:16
Cette fois, ça a l'air d'être la bonne! :)

#!/bin/bash

if ! [[ $1 =~ ^[0-9]+$ ]] || [ $# -ne 1 ]
then
echo "Veuillez rentrer un chiffre ou nombre en paramètre!"
elif [ $1 -eq 10 ]
then
echo "parfait!"
elif [ $1 -gt 10 ]
then
echo "c'est trop!"
else
echo "ce n'est pas assez!"
fi


Je sais que l'ordre des conditions a un impact sur le script. Donc je me demande: est-ce qu'il en est de même pour l'ordre des tests pour une condition (par exemple, est-ce que ça aurait changé quelque chose si j'avais mis
if [ $# -ne 1 ] || ! [[ $1 =~ ^[0-9]+$ ]]
à la place) ?

(au passage: regex ça se prononce [ré-guèkse] ou [ré-jèkse] ?)
Exileur 1127 Messages postés mercredi 31 août 2011Date d'inscription 14 septembre 2017 Dernière intervention - 17 août 2017 à 15:32
oui ça a un impact.

Moi j'aurais fait.

SI $1 different d'un nombre
___ce n'est pas un nombre
___exit 1
SINON SI $1 ... etc etc
charline159 65 Messages postés lundi 14 août 2017Date d'inscription 28 octobre 2017 Dernière intervention - 17 août 2017 à 16:13
Quand tu dis exit1, tu veux dire que je fais un
fi
pour terminer mon premier
if
?

Sinon, dans cette regex
! [[ $1 =~ ^[0-9]+$ ]]
:
!
sert à inverser le test
^[...]
est ce qui se trouve en début de ligne
$
est ce qui se trouve en fin de ligne

Par contre je ne vois pas à quoi servent
~
et
+
?
Exileur 1127 Messages postés mercredi 31 août 2011Date d'inscription 14 septembre 2017 Dernière intervention - 17 août 2017 à 16:51
enfaite, il 'faudrait' segmenter ton code.

1ere partie tu controles la donnée.
C'est bon on continue le code.
C'est pas bon, on quite le script avec un exit 1

2eme partie tu l'a traites
et tu peux quiter le script avec un exit 0 comme quoi tout c'est bien passé

-------------------------

le ! sert a inversé en BASH

^ Beginning. Matches the beginning of the string, or the beginning of a line if the multiline flag (m) is enabled.
[ Character set. Match any character in the set.
0-9 Range. Matches a character in the range "0" to "9" (char code 48 to 57).
]
+ Plus. Match 1 or more of the preceding token.
$ End. Matches the end of the string, or the end of a line if the multiline flag (m) is enabled.

Les expression régulière c'est beau, c'est bien, c'est puissant. :)
Et c'est utile partout, dans presque tout les languages :)
charline159 65 Messages postés lundi 14 août 2017Date d'inscription 28 octobre 2017 Dernière intervention - 17 août 2017 à 18:11
Ok, je vois, merci beaucoup pour ta réponse! :)
Commenter la réponse de Exileur