Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/12/2007, 16h11   #1
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
Par défaut tester si un argument est de type entier

Bonjour
j ai une fonction qui crashe si je lui passe un argument non entier. Je voudrais ajouter un test pour m'avertir aund le type du premier argument n'est pas entier.

Code :
1
2
3
if $1 ......
then
exit
??

Merci
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2007, 16h26   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
Quelque chose comme ça ?
Code :
1
2
3
4
if [[ $1 == +([0-9]) ]] 
then 
   ... est entier... 
fi
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2007, 16h31   #3
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 779
Points : 7 779
utiliser les type sets permet d'éviter de tester les valeurs après leur entrées ce qui interdit donc toute erreur de détection potentielle.

man bash
man ksh
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2007, 16h43   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
Citation:
Envoyé par frp31 Voir le message
utiliser les type sets permet d'éviter de tester les valeurs après leur entrées ce qui interdit donc toute erreur de détection potentielle.
Mais il ne faut pas oublier de trapper le message d'erreur...
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2007, 18h12   #5
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
j'ai essayé :

typeset -i $1="99999999"

ca ne marche pas.. erreur de syntaxe?
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2007, 18h16   #6
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
Citation:
Envoyé par freestyler Voir le message
j'ai essayé :

typeset -i $1="99999999"

ca ne marche pas.. erreur de syntaxe?
Code :
 typeset -i mavariable=$1
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2007, 18h21   #7
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
oui oui je viens de le faire comme ceci
il fallait donc declarer une variable puis l'utiliser en tant que telle dans ma fonction

Le problème, c'est que si je lui rentre un non entier, il le convertit à zéro et continue le traitement, alors aue je veux au'il sorte (sans oublier aussi le fait que je peux avoir besoin du zéro)
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 09h55   #8
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
je me suis peut être mal exprimé.

Quand j'utilise
Code :
typeset -i mavariable=$1
tout se passe bien, sauf que si j'appelle ma fonction ainsi : (shell biensur)
" mafonction eeee ", je n'ai pas de message d'erreur, mais plutot la fonction s'exécute normalement comme ci je l'ai appelé ainsi : " mafonction 0"
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 11h03   #9
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
C'est au moment de l'affectation qu'une erreur est générée ou non
Il faut donc tester le code retour de l'affectation
Code :
1
2
3
4
5
6
7
8
typeset -i mavariable
mavariable=$1
if [ $? -eq 0 ]
then 
   echo $1 est un entier 
 else 
   echo $1 n'est pas un entier 
fi
Le test et l'affectation peuvent être regroupés
Code :
1
2
3
typeset -i mavariable
if mavariable=$1 # ceci est une affectation, pas un test d'égalité !
 then ...
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 11h10   #10
Membre éprouvé
 
Homme
Ingénieur systèmes et réseaux
Inscription : août 2007
Messages : 508
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : août 2007
Messages : 508
Points : 464
Points : 464
Bah pour faire plus simple,
il y'a l'option -n qui permet de tester si un arg est un entier.

Code :
1
2
3
4
5
6
 
if [ -n  "$arg"  ] ; then
     echo "OK"
else 
     echo "KO"
fi
publicStaticVoidMain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 11h26   #11
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
d'abord, le -n ne marche pas... il s'agit de tester si la longueur de la chaine donnée en argument est nulle ou pas, et je ne sais pas ou est ce que t'as trouvé ça, mais je suis preneur s'il s'avère vrai (en tout cas j'ai testé et ça ne marche pas)

sinon, le problème avec
Code :
1
2
3
4
5
6
if [ $? -eq 0 ]
then 
   echo $1 est un entier 
 else 
   echo $1 n'est pas un entier 
fi
c'est que j'ai besoin du Zero.. c'est ce aue j'ai essayé d'expliquer la première fois, sinon, oui c'est trivial de faire un petit test comme celui là.


Merci
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 11h41   #12
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
$? contient la valeur de retour de la dernière commande exécutée, ici l'affectation, pas la valeur de la variable
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 11h50   #13
Membre éprouvé
 
Homme
Ingénieur systèmes et réseaux
Inscription : août 2007
Messages : 508
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : août 2007
Messages : 508
Points : 464
Points : 464
Citation:
Envoyé par freestyler Voir le message
d'abord, le -n ne marche pas... il s'agit de tester si la longueur de la chaine donnée en argument est nulle ou pas, et je ne sais pas ou est ce que t'as trouvé ça, mais je suis preneur s'il s'avère vrai (en tout cas j'ai testé et ça ne marche pas)

sinon, le problème avec
Code :
1
2
3
4
5
6
if [ $? -eq 0 ]
then 
   echo $1 est un entier 
 else 
   echo $1 n'est pas un entier 
fi
c'est que j'ai besoin du Zero.. c'est ce aue j'ai essayé d'expliquer la première fois, sinon, oui c'est trivial de faire un petit test comme celui là.


Merci
Normalement ca devrait marcher. Fais un man test ou man bash, tu devrais trouver les explications sur cette option

man test:
-n string
True if the length of string is non-zero.
publicStaticVoidMain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 11h55   #14
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
Citation:
Envoyé par publicStaticVoidMain Voir le message
Normalement ca devrait marcher. Fais un man test ou man bash, tu devrais trouver les explications sur cette option
Relis le titre de la discussion...
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 12h02   #15
Membre éprouvé
 
Homme
Ingénieur systèmes et réseaux
Inscription : août 2007
Messages : 508
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : août 2007
Messages : 508
Points : 464
Points : 464
Citation:
Envoyé par al1_24 Voir le message
Relis le titre de la discussion...
bah g compris, après il me dit ça :

Citation:
Envoyé par freestyler Voir le message
d'abord, le -n ne marche pas... il s'agit de tester si la longueur de la chaine donnée en argument est nulle ou pas, et je ne sais pas ou est ce que t'as trouvé ça, mais je suis preneur s'il s'avère vrai (en tout cas j'ai testé et ça ne marche pas)

sinon, le problème avec
Code :
1
2
3
4
5
6
if [ $? -eq 0 ]
then 
   echo $1 est un entier 
 else 
   echo $1 n'est pas un entier 
fi
c'est que j'ai besoin du Zero.. c'est ce aue j'ai essayé d'expliquer la première fois, sinon, oui c'est trivial de faire un petit test comme celui là.


Merci
publicStaticVoidMain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 12h07   #16
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
Il répondait à ça :
Citation:
Envoyé par publicStaticVoidMain Voir le message
il y'a l'option -n qui permet de tester si un arg est un entier.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 12h28   #17
Membre du Club
 
Inscription : septembre 2006
Messages : 339
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 339
Points : 47
Points : 47
c'est pas au moment de l'affectation que l'erreur est générée..
en fait, lors de l'affectation, le typeset va forcer une argument non entier à zéro... du coup y a pas d'erreur générée..

je vois ou tu veux en venir, mais je ne crois pas que c'est ce qu'il me faut.. sous réserve que j'ai compris biensur...


sinon, publicvoidmain... je ne comprends pas ce que tu dis.. je crois que tu t'es un peu égaré dans le sujet, non?
et merci, je sais utiliser man
freestyler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2007, 12h44   #18
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 451
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 451
Points : 7 563
Points : 7 563
Citation:
Envoyé par freestyler Voir le message
c'est pas au moment de l'affectation que l'erreur est générée..
en fait, lors de l'affectation, le typeset va forcer une argument non entier à zéro... du coup y a pas d'erreur générée..
En effet, j'avais testé avec ksh qui est plus restrictif que bash
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2007, 15h39   #19
Membre éprouvé
 
Homme
Ingénieur systèmes et réseaux
Inscription : août 2007
Messages : 508
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : août 2007
Messages : 508
Points : 464
Points : 464
En effet, je me suis trompé et je m'en excuse.
Je croyais que l'option -n permettait de tester si un arg était un entier. Quand j'ai lu le man de bash ou man test, apparemment il y'a pas d'options qui permet de le tester. En fait , j'ai trouvé un autre moyen pour tester si un argument est un entier :

Code :
1
2
3
4
5
6
 
if  `echo "$arg" | grep "[+|-][123456789]"` ; then
 echo "OK"
else 
 echo "KO"
fi
Je teste la valeur de retour du grep. Si ca vaut zero, on affiche "OK" ou sinon on affiche "KO"

J'espere que ca peut t'aider.
publicStaticVoidMain est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h23.


 
 
 
 
Partenaires

Hébergement Web