Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
un petit script
Envoyé par: mickpiet

Bonjour, j'ai un script a faire et je voudrais savoir comment on peut faire pour n'autoriser que la saisie de nombre et renvoyer un message d'erreur si on saisie une chaine de caractere (de lettres). Merci
@++

Poste le Wednesday 27 December 2006 16:40:43
Répondre     Citer    
Re: un petit script

Une façon de faire

if [ "${variable//[0-9]/0}" -eq 0 ] 
  then echo "numerique -> OK" 
  else echo "pas num -> PAS OK" 
fi

--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Wednesday 27 December 2006 18:07:47
Répondre     Citer    
Re: un petit script
Envoyé par: mickpiet

je viens de tester, ca a pas l'air de marcher.

ma variable est nbr et comme test j'ai mis:

if [ "${nbr//[0-9]/0} -ne 0 ]
then
dialog --stdout --msgbox "la quantité s'exprime en nombre" 5 50
return
fi



au test si je rentre une chaine de caractere dans mon imputbox a la base ca l'enregistre quand meme et ca m'envoie pas la fenetre d'erreur :-/

Poste le Wednesday 27 December 2006 18:35:29
Répondre     Citer    
Re: un petit script
Envoyé par: phenix

je rêve ou je vois une division par zero ( j'ai pas testé, c'est peut être bon ) . ;-)

pour tester entier

if [ $entier != 0 ]; then
if [ $[ $entier / 1] = 0 ]; then
echo "tu t'es planté !!"
fi
fi

$ uptime
19:28:06 up 12 days, 20:46,  2 users,  load average: 213.96, 212.37, 208.44

Poste le Wednesday 27 December 2006 19:50:20
Répondre     Citer    
Re: un petit script
Envoyé par: Sve@r

Citation
mickpiet
Bonjour, j'ai un script a faire et je voudrais
savoir comment on peut faire pour n'autoriser que
la saisie de nombre et renvoyer un message
d'erreur si on saisie une chaine de caractere (de
lettres). Merci
@++
C'est amusant car ce problème fait partie d'un des TP de mon cours.
Ma solution est de faire une opération sur la variable saisie. Si l'opération réussit, c'est que la variable est un nombre sinon...

Exemple
expr $variable + 0 1>/dev/null 2>&1
if test $? -lt 2
then
  echo "numerique -> OK" 
else
  echo "pas num -> PAS OK" 
fi

Et tu peux même mettre ça en fonction de vérif que tu appelles quand tu veux
Exemple
numeric()
{
  expr $1 + 0 1>/dev/null 2>&1
  test $? -lt 2 && return 0 || return 1
}

while true
do
    echo "Saisissez un nombre"
    read nb
    numeric $nb && break
    echo "Votre nombre saisi n'est pas un nombre - Recommencez"
done

Citation
Frédéric Brugmans
if [ "${variable//[0-9]/0}" -eq 0 ]
then echo "numerique -> OK"
else echo "pas num -> PAS OK"
fi

J'aime beaucoup cette solution qui est de remplacer chaque chiffre par 0 puis de comparer le résultat avec 0... mais j'ai la faiblesse de préférer la mienne. Cependant cette solution a l'avantage de rester interne shell alors que la mienne fait appel à un programme externe. Mais c'est ma façon de faire (toujours faire faire par les autres...)



L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Wednesday 27 December 2006 21:59:36
Répondre     Citer    
Re: un petit script
Envoyé par: Sve@r

Citation
phenix
je rêve ou je vois une division par zero
Tu rêves. Et c'est à ce moment que
1) tu te réveilles
2) tu relis ton cours de shell (si tu l'as seulement lu un jour)
3) tu réalises que "/0" n'est pas "division par zéro" mais "remplacement du caractère situé avant le slash par le caractère 0"
4) tu te rendors et tu rêve que tu n'as jamais écrit ce post (malheureusement on peut pas l'effacer...)
yawning smiley)


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Wednesday 27 December 2006 22:04:23
Répondre     Citer    
Re: un petit script
Envoyé par: AlSim

Citation
mickpiet
je viens de tester, ca a pas l'air de marcher.

ma variable est nbr et comme test j'ai mis:

if [ "${nbr//[0-9]/0} -ne 0 ]
then
dialog --stdout --msgbox "la quantité s'exprime
en nombre" 5 50
return
fi

au test si je rentre une chaine de caractere dans
mon imputbox a la base ca l'enregistre quand meme
et ca m'envoie pas la fenetre d'erreur
Tu as oublié de fermer tes guillemets...

[catwell.info]

Poste le Wednesday 27 December 2006 23:55:37
Répondre     Citer    
Re: un petit script
Envoyé par: mickpiet

l'oublie de guillemets est seulement une erreur de recopiage.

merci beaucoup, je vais essayer vos solutions, on verra si j'y arrive

Poste le Thursday 28 December 2006 01:18:41
Répondre     Citer    
Re: un petit script
Envoyé par: Mushroom

Bonsoir,

Pour la solution de Frédéric Brugmans c'est très efficace mais ça ne marche qu'avec BASH. :-)

Perso je passerais (encore) par sed :

if [ -z "$(echo ${variable} | sed /^[0-9]*$/!d)" ]; then
    echo "pas num -> PAS OK" 
else 
    echo "numerique -> OK" 
fi

Poste le Friday 29 December 2006 20:58:21
Répondre     Citer    
Re: un petit script
Envoyé par: Sve@r

Citation
Mushroom
Pour la solution de Frédéric Brugmans c'est très efficace mais ça ne marche qu'avec BASH.
Hé oui. Quand tu connaitras mieux Frédéric brugmans (en lisant ses réponses) tu verras qu'il a toujours de très bonnes et très performantes solutions... mais qu'elles utilisent quasiment toujours des outils bash.

En général mes solutions sont souvent plus "lourdes" car j'ai l'habitude de tout décomposer... mais elles sont toujours 100% combatibles /bin/sh. Je pense quand-même que cela devient de plus en plus inutile vu que le bash arrive de partout...

Citation
Mushroom
Perso je passerais (encore) par sed :

if [ -z "$(echo ${variable} | sed /^[0-9]*$/!d)"]; then
    echo "pas num -> PAS OK" 
else 
    echo "numerique -> OK" 
fi
Joli !!!

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Saturday 30 December 2006 14:59:58
Répondre     Citer    
Re: un petit script
Envoyé par: mickpiet

merci beaucoupppp, la solution de Mushroom marche nikel.
Par contre, n'étant pas très bon en script, est ce qu'il y a moyen que vous m'expliquiez en détail ce que fait cette ligne d'opérations ?? merci

Poste le Sunday 31 December 2006 16:08:50
Répondre     Citer    
Re: un petit script
Envoyé par: Mushroom

Salut,

Allez, sortons notre boîte Mattel® Petit Sve@r yawning smiley)

-z est un test qui est vrai si la chaîne donnée en argument est vide et "$()" récupère la sortie de la commande qu'il enserre (cf. man bash).

"^[0-9]*$" est une expression régulière qui désigne une chaîne vide ou composée exclusivement de chiffres entre 0 et 9.

^ -> début de la ligne.
[0-9]* -> 0, un ou plusieurs chiffres entre 0 et 9.
$ -> fin de ligne.

Je mets ça dans /<expression>/d qui indique à sed de détruire toute ligne correspondant à cette définition. Mais comme je veux justement l'inverse (je veux garder la chaîne qui correspond), je mets un "!" (non) devant d qui à présent détruit toute chaîne qui ne correspond pas à la description.

Au final on a un filtre qui ne laisse passer que des nombres. Si le test est vrai, c'est donc que soit il y a un non numérique dans la variable, soit que la variable était déjà vide. :-)

Poste le Sunday 31 December 2006 18:07:56
Répondre     Citer    
Re: un petit script
Envoyé par: Sve@r

Citation
Mushroom
Allez, sortons notre boîte Mattel® Petit Sve@r
C'est mickpiet qui a posé la question et pas moi. Tu devrais aller lire mon CV qui est sur mon site perso ce qui t'évitera à l'avenir de me reprendre pour une burne en shell...
Citation
Mushroom
...soit que la variable était déjà vide
Tu remplaces dans l'expression
${variable}
par
${variable:-" "}
Et t'auras plus ce pb...

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Sunday 31 December 2006 18:20:38
Répondre     Citer    
Re: un petit script
Envoyé par: AlSim

Citation
Sve@r
C'est mickpiet qui a posé la question et pas moi. Tu devrais aller lire mon CV qui est sur mon site perso ce qui t'évitera à l'avenir de me reprendre pour une burne en shell...
Etant donné que le "Petit Sve@r" était aussi en italique, je pense que "Mattel Petit Sve@r" était le nom de la boite dans l'esprit de Mushroom. Ca doit être une parodie d'un jouet existant, avec un nom connu à la place, en clair je pense qu'il te prend plutôt pour une référence. Ca me semblerait logique vu que depuis le temps où il vient sur ce forum il a déjà dû lire tes autres posts...

[catwell.info]

Poste le Monday 1 January 2007 00:38:47
Répondre     Citer    
Re: un petit script
Envoyé par: Sve@r

Citation
AlSim
Etant donné que le "Petit Sve@r" était aussi en italique, je pense que "Mattel Petit Sve@r" était le nom de la boite dans l'esprit de Mushroom. Ca doit être une parodie d'un jouet existant, avec un nom connu à la place...
Hum... faire de l'humour dans un post c'est déjà très difficile car on ne peut pas y inclure les inflexions de voix qui montrent justement l'humour lors d'un échange verbal. Alors faire un plus un private joke entre un jeu qui n'est pas forcément connu de tous et un pseudo d'un autre participant du forum, il y avait toutes les chances que cela tombât parfaitement à plat ce qui fût le cas...


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Monday 1 January 2007 14:01:15
Répondre     Citer    
Re: un petit script
Envoyé par: Mushroom

Bonsoir,

Citation

Tu remplaces dans l'expression

${variable}
par

${variable:-" "}
Et t'auras plus ce pb...
Une chaîne vide n'est pas un nombre, il n'y aura donc aucun problème au niveau de la cohérence du filtre. Je n'ai jamais dit que c'en était un.

Citation

Hum... faire de l'humour dans un post c'est déjà très difficile car on ne peut pas y inclure les inflexions de voix qui montrent justement l'humour lors d'un échange verbal.
Mea culpa, j'aurais dû mettre un smiley à la fin genre, je ne sais pas, un petit clown...

Citation

Tu devrais aller lire mon CV qui est sur mon site perso ce qui t'évitera à l'avenir de me reprendre pour une burne en shell...
Vu. Un conseil : tu devrais aussi user de smileys, au moins en page d'accueil : un esprit un poil terre-à-terre pourrait passer à côté du savoureux deuxième degré qui émaille chaque page de ce merveilleux site. Quelle subtilité dans l'auto-dérision !

Citation
AlSim
Etant donné que le "Petit Sve@r" était aussi en italique, je pense que "Mattel Petit Sve@r" était le nom de la boite dans l'esprit de Mushroom. Ca doit être une parodie d'un jouet existant, avec un nom connu à la place, en clair je pense qu'il te prend plutôt pour une référence. Ca me semblerait logique vu que depuis le temps où il vient sur ce forum il a déjà dû lire tes autres posts...
Je faisais référence à son habitude d'expliciter entièrement les scripts, ce que je ne fais pour ma part pas spontanément (je touve ça assez barbant et en plus ça fait poster de grosses tartines).

Aussi j'ai dans le cas présent exceptionnellement joué au petit Sve@r comme on joue au petit chimiste (auquel je ne joue pas très souvent non plus, pour tout dire). C'était donc plus un clin d'oeil qu'une blague. Une sorte de geste de sociabilité en somme...

Enfin, ayant mesuré la sublime hauteur avec laquelle chacune des sus-mentionnées explicitations est livrée, je vais laisser son altitude à l'enluminure de ses lettres de noblesse.

---

Poste le Monday 1 January 2007 23:26:29
Répondre     Citer    
Re: un petit script
Envoyé par: Sve@r

Citation
Mushroom
Je faisais référence à son habitude d'expliciter entièrement les scripts, ce que je ne fais pour ma part pas spontanément (je touve ça assez barbant et en plus ça fait poster de grosses tartines).
Evidemment tu préfères laisser le débutant se débrouiller pour comprendre. De toute façon c'est de sa faute, il n'a qu'à ne pas être débutant n'est-ce pas ?

Citation
Mushroom
Une sorte de geste de sociabilité en somme
Une "sorte"...

Citation
Mushroom
Enfin, ayant mesuré la sublime hauteur avec laquelle chacune des sus-mentionnées explicitations est livrée, je vais laisser son altitude à l'enluminure de ses lettres de noblesse.

<myway.linus>Brugmans est un lâche, tout juste bon à proposer des solutions idiotes pour hamsters dégénérés débutant en shell (je précise pour les crétins que je ne mets pas de "s" à "débutant" parce que c'est ici un participe présent, présent sans "a").</fuckthestandards>
Chacun ses lettres, chacun son altitude.

Citation
Mushroom
Pour la solution de Frédéric Brugmans c'est très efficace mais ça ne marche qu'avec BASH.

Perso je passerais (encore) par sed :

if [ -z "$(echo ${variable} | sed /^[0-9]*$/!d)" ]; then ...
Ta solution aussi ne marche qu'avec BASH...
if [ -z "`echo ${variable} | sed /^[0-9]*$/!d`" ]; then ...




L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Tuesday 2 January 2007 14:17:55
Répondre     Citer    
Re: un petit script
Envoyé par: .Mushroom

Bonsoir,

Citation
Sve@r
Evidemment tu préfères laisser le débutant se débrouiller pour comprendre. De toute façon c'est de sa faute, il n'a qu'à ne pas être débutant n'est-ce pas ?
Alors là, mais tout à fait ! c'est la nature qui parle : il y a les élus qui connaissaient le shell dès leur premier souffle, et puis la lie qui se traîne de forum en forum pour mendier de l'aide. Tu ne pouvais pas être plus proche de ma vision des choses.

Je sais, c'est très élitiste. Encore, le shell serait bien documenté avec des documentations en ligne et des pages de manuel en français dans le texte... ou, que sais-je, il serait interactif et laisserait toute licence pour tester chaque morceau de script individuellement. Mais non ! je sais c'est un poil dur, mais c'est ainsi : si on m'écoutait, il faudrait noyer les débutants par demi-douzaines comme des petits chatons.

D'ailleurs, pour tout te dire, quand on me demande -- même l'oeil scintillant de larmes -- d'expliquer un peu plus, et bien je refuse -- tout net ! -- de m'abaisser à ça. Par exemple là... ah non pas là... ce doit être que les esprits même les plus contrefaits m'inspirent quelque compassion. Assurément.

Entre toi et moi, je ne sais qui prend le plus les débutants pour des débiles profonds.

Citation
Sve@r
Chacun ses lettres, chacun son altitude.
Mea maxima culpa, j'aurais du mettre des balises, histoire qu'on voit bien que ce message était dans son contexte d'un type un peu particulier (et puis glisser quelques références à un acteur du libre bien connu pour son humour à froid).

Que tu ne goûtes pas mon humour, c'est une chose, que tu sois à ce point incapable de discerner premier et second degrés, c'est pitié.

Citation
Sve@r
Ta solution aussi ne marche qu'avec BASH...
Je ne possède pas d'UNIX propriétaire, mais elle passe avec ash, ksh et zsh (pour peu qu'on ajoute des guillemets autour de l'expression régulière)...

Poste le Tuesday 2 January 2007 18:26:56
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
un petit script
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons