Dans un script shell, je demande d'entrer un chiffre de 0 à 59. Comment vérifier son résultat ?
"59" est un nombre sur deux chiffres.
deux moyens simples :
case "$result" in [0-9]|[1-5][0-9]) echo ok;; *) echo ko;; esac
ou
test $result -le 59 -a $result -ge 0 && echo ok
Le premier évite habilement le lourd "if echo | grep"
Merci Laurent ! :-)
-- S'il n'y a pas de solutions, c'est qu'il n'y a pas de problèmes iChat/AIM : michelnicolas
Stephane Chazelas
2005-04-13, 14:51(+00), Laurent Wacrenier:
Nicolas MICHEL écrit:
Dans un script shell, je demande d'entrer un chiffre de 0 à 59. Comment vérifier son résultat ?
"59" est un nombre sur deux chiffres.
deux moyens simples :
case "$result" in [0-9]|[1-5][0-9]) echo ok;; *) echo ko;; esac
ou
test $result -le 59 -a $result -ge 0 && echo ok
Le premier évite habilement le lourd "if echo | grep"
Le deuxieme ne marche que si $result est un nombre valide. Sinon, il peut y avoir des messages d'erreurs ou des resultats inattendus suivant les shells (par exemple si $result vaut "RANDOM" ou "SECONDS" ou "(" sans parler de "*", "" ou "a = a -a 3" vu que les quotes ont ete oubliees...)
Le premier ne marche plus si "001", "0x12" doivent etre considerés comme valides ou 09 comme invalide (mauvais octal)
Avec un shell POSIX:
if case "$result" in *[!0-9a-fA-FxX]*|0[xX]|0[xX]*[xX]*|"") false;; 0x*) [ "$(($result))" -le 59 ];; 0*[!0-7]*|*[!0-9]*) false;; *) [ "$(($result))" -le 59 ];; esac then echo ok else echo ko fi
-- Stéphane
2005-04-13, 14:51(+00), Laurent Wacrenier:
Nicolas MICHEL <Nicolas.MICHEL@BonBon.net> écrit:
Dans un script shell, je demande d'entrer un chiffre de 0 à 59.
Comment vérifier son résultat ?
"59" est un nombre sur deux chiffres.
deux moyens simples :
case "$result" in
[0-9]|[1-5][0-9]) echo ok;;
*) echo ko;;
esac
ou
test $result -le 59 -a $result -ge 0 && echo ok
Le premier évite habilement le lourd "if echo | grep"
Le deuxieme ne marche que si $result est un nombre valide.
Sinon, il peut y avoir des messages d'erreurs ou des resultats
inattendus suivant les shells (par exemple si $result vaut
"RANDOM" ou "SECONDS" ou "(" sans parler de "*", "" ou "a = a
-a 3" vu que les quotes ont ete oubliees...)
Le premier ne marche plus si "001", "0x12" doivent etre
considerés comme valides ou 09 comme invalide (mauvais octal)
Avec un shell POSIX:
if
case "$result" in
*[!0-9a-fA-FxX]*|0[xX]|0[xX]*[xX]*|"") false;;
0x*) [ "$(($result))" -le 59 ];;
0*[!0-7]*|*[!0-9]*) false;;
*) [ "$(($result))" -le 59 ];;
esac
then
echo ok
else
echo ko
fi
Dans un script shell, je demande d'entrer un chiffre de 0 à 59. Comment vérifier son résultat ?
"59" est un nombre sur deux chiffres.
deux moyens simples :
case "$result" in [0-9]|[1-5][0-9]) echo ok;; *) echo ko;; esac
ou
test $result -le 59 -a $result -ge 0 && echo ok
Le premier évite habilement le lourd "if echo | grep"
Le deuxieme ne marche que si $result est un nombre valide. Sinon, il peut y avoir des messages d'erreurs ou des resultats inattendus suivant les shells (par exemple si $result vaut "RANDOM" ou "SECONDS" ou "(" sans parler de "*", "" ou "a = a -a 3" vu que les quotes ont ete oubliees...)
Le premier ne marche plus si "001", "0x12" doivent etre considerés comme valides ou 09 comme invalide (mauvais octal)
Avec un shell POSIX:
if case "$result" in *[!0-9a-fA-FxX]*|0[xX]|0[xX]*[xX]*|"") false;; 0x*) [ "$(($result))" -le 59 ];; 0*[!0-7]*|*[!0-9]*) false;; *) [ "$(($result))" -le 59 ];; esac then echo ok else echo ko fi
-- Stéphane
FAb
Stephane Chazelas writes:
2005-04-13, 14:51(+00), Laurent Wacrenier:
Nicolas MICHEL écrit:
Dans un script shell, je demande d'entrer un chiffre de 0 à 59. Comment vérifier son résultat ?
"59" est un nombre sur deux chiffres.
deux moyens simples :
case "$result" in [0-9]|[1-5][0-9]) echo ok;; *) echo ko;; esac
ou
test $result -le 59 -a $result -ge 0 && echo ok
Le premier évite habilement le lourd "if echo | grep"
Le deuxieme ne marche que si $result est un nombre valide.
declare -i result test $result -le 59 -a $result -ge 0 && echo ok
Si on file un truc pas bon $result vaut 0 (ce qui n'est p-ê pas demandé mais c'est juste pour parler de declare/typeset)
C'est POSIX ? Tu ne confonds pas avec $(( $NBRE >= 0 && $NBRE <= 59 ))
Non, je ne confonds pas ;)
Mais tu me fais douter : je ne sais pas si la forme ((...)) est normalisée (et j'ai la flemme de rechercher).
Mais je confirme qu'elle est reconnue par zsh, ksh93 et bash. -- Éric Jacoboni, né il y a 1416922718 secondes
Stephane Chazelas
2005-04-14, 12:15(+02), Fred: [...]
"declare" n'existe pas en Bourne Shell. C'est spécifique au bash ou au ksh. [...]
C'est principalement bash. ksh et zsh ont typeset. zsh a declare aussi pour convenience pour ceux qui viennent de bash.
L'un comme l'autre ne sont pas super bien nommé.
Note qu'on ne trouve le Bourne shell aujourd'hui guere plus que chez Solaris.
Ca fait plus de sens de dire que typeset comme declare ne sont pas POSIX/SUSv3, c'est a dire qu'un Unix n'est pas censé avoir "declare" dans son "sh" POSIX.
-- Stéphane
2005-04-14, 12:15(+02), Fred:
[...]
"declare" n'existe pas en Bourne Shell. C'est spécifique au bash ou au ksh.
[...]
C'est principalement bash. ksh et zsh ont typeset. zsh a declare
aussi pour convenience pour ceux qui viennent de bash.
L'un comme l'autre ne sont pas super bien nommé.
Note qu'on ne trouve le Bourne shell aujourd'hui guere plus que
chez Solaris.
Ca fait plus de sens de dire que typeset comme declare ne sont
pas POSIX/SUSv3, c'est a dire qu'un Unix n'est pas censé avoir
"declare" dans son "sh" POSIX.
"declare" n'existe pas en Bourne Shell. C'est spécifique au bash ou au ksh. [...]
C'est principalement bash. ksh et zsh ont typeset. zsh a declare aussi pour convenience pour ceux qui viennent de bash.
L'un comme l'autre ne sont pas super bien nommé.
Note qu'on ne trouve le Bourne shell aujourd'hui guere plus que chez Solaris.
Ca fait plus de sens de dire que typeset comme declare ne sont pas POSIX/SUSv3, c'est a dire qu'un Unix n'est pas censé avoir "declare" dans son "sh" POSIX.