[Korn Shell] Test d'égalité

Test d'égalité [Korn Shell] - Shell/Batch - Programmation

Marsh Posté le 18-05-2005 à 10:18:42    

Bonjour,
Je ne suis pas spécialiste du shell, mais en général je me débrouille.
Malheureusement depuis vendredi, je sèche sur un script et malgrès toutes mes recherches sur le net ou mes lectures, je ne trouve pas pourquoi mon script ne fonctionne pas. Je fais donc appel à vos lumières.  :jap:  
 
Je commence par récupérer un valeur dans une table d'une base de données puis, suivant la valeur que j'obtiens, j'affecte à une autre variable une valeur prédéfinie (qui sera en fait le nom du script sql à lancer).
 
Voici la partie de mon script qui ne fonctionne pas (en fait le test) :
 
#recuperation du choix de traitement
select 'CHX=', par01_1 from req where numero = ${PND_TRAIT};
EOF`
 
CHX=`echo $CHX| sed 's/.*CHX=//'`
 
if ${CHX} = "1"
then
        PROG=accord
else
        if "${CHX}" = "2"
        then
                PROG=heure
        else
                PROG=heure2
        fi
fi
 
echo ${PROG}
 
La requête dans la base ramène ce qu'il faut (à savoir une chaine de caractère qui vaut "1", "2" ou "3". Mais quelque que soit la valeur contenue dans $CHX, $PROG contient toujours heure2.  :heink:  
 
Si vous voyez la faille de mon script, vous seriez plus que gentil de me mettre le nez dessus.
Merci

Reply

Marsh Posté le 18-05-2005 à 10:18:42   

Reply

Marsh Posté le 18-05-2005 à 10:20:21    

if [ -eq ${CHX} "2" ]
 
non ?


Message édité par elianor le 18-05-2005 à 10:20:32

---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
Reply

Marsh Posté le 18-05-2005 à 10:24:51    

J'avais déjà testé et je viens de nouveau de tester ... pareil :(
 
Alors maintenant je me demande si cela ne vient pas d'une bizarrerie du shell sous lequel je travaille.

Reply

Marsh Posté le 18-05-2005 à 11:03:23    

C'est pas ksh, c'est test qu'il faut voir.
 
La syntaxe [ ] est un raccourci en ksh pour accéder à ce binaire.
 
Donc l'idéal est de faire "man test" pour avoir les informations nécessaires.
 
Mais pour t'aider, sache que les opérateurs -eq, -ne, -lt etc. sont réservés aux tests numériques.
Pour les chaînes, c'est =, !=, < etc.
 
Donc le mieux est d'écrire :

Code :
  1. #!/bin/ksh
  2. <...>
  3. CHX=`echo $CHX| sed 's/.*CHX=//'`
  4. if [ "${CHX}" = "1" ]
  5. then
  6.    PROG=accord
  7. elif [ "${CHX}" = "2" ]
  8. then
  9.    PROG=heure
  10. else
  11.    PROG=heure2
  12. fi
  13. echo ${PROG}


 
Normalement, ça fonctionne.

Reply

Marsh Posté le 18-05-2005 à 17:11:05    

Marche pas non plus ...  :cry:

Reply

Marsh Posté le 18-05-2005 à 17:26:21    

[ $CHX -eq 2 ]

Reply

Marsh Posté le 18-05-2005 à 17:31:11    

Azariel a écrit :

Marche pas non plus ...  :cry:


 
Pas normal.
 
Testé des tas de fois, ça fonctionne.
 
Ca vient pas du test alors, ça doit provenir de $CHX qui contient j'sais pas quoi.
Fait un "echo $CHX" avant le if, pour voir ce que ça donne.
 
 
 

Citation :

[ $CHX -eq 2 ]


 
Surtout pas, sauf si tu testes avant que $CHX n'est pas une chaîne vide, ou que tu es absolument, complètement, 100% sûr que $CHX ne sera jamais vide.  
Sinon le shell va interpréter ça comme [ -eq 2 ] et il va hurler.
Eventuellement, tu peux écrire, pour éviter toute erreur :

if [ "$CHX" -eq 2 ]


Mais personnellement je n'aime pas le mélange des genres. Ceci dit comme en shell ça n'a pas d'importance, c'est une possibilité.


Message édité par Elmoricq le 18-05-2005 à 17:38:37
Reply

Marsh Posté le 19-05-2005 à 09:22:35    

:wahoo: Bon, merci à vous !
Je vais me résoudre à aller déranger l'ingenieur système ... quitte à ce qu'il rale ... mais lui au moins doit connaitre les subtilités de son shell.
 
Encore merci  :jap:

Reply

Marsh Posté le 19-05-2005 à 09:27:28    

Citation :

mais lui au moins doit connaitre les subtilités de son shell.


 
 :heink:  
 
Y a pas 36 façons de faire un test. S'il se déroule pas correctement, c'est que le problème est ailleurs.

Reply

Marsh Posté le 19-05-2005 à 13:53:28    

Ouais. Et en fait je pense que je connais aussi bien ksh que ton ingé système.

Reply

Marsh Posté le 19-05-2005 à 13:53:28   

Reply

Marsh Posté le 11-06-2005 à 23:33:06    

1.- Commence par ajouter un "set -x" au début de ton script pour avoir l'output des settings de variables et les valeurs des tests effectués.
2.- Utilise un nom différent entre la variable a set et celle utilisée en input du sed
CHX2=`echo $CHX | sed ...`
3.- Utilise case/esac pour ce genre de tests:
 

CHX2= ...
case $CHX2 in
     1) PROG="..." ;;
     2) PROG="..." ;;
     *) PROG="else ..." ;;
esac ; echo $PROG


Message édité par Deadlock le 11-06-2005 à 23:34:50

---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

Marsh Posté le 19-06-2005 à 01:59:58    

les tests d'égalité en shell ne doivent pas contenir d'espace

Code :
  1. if [ "${CHX}" = "1" ]

est faux
par contre

Code :
  1. if [ "${CHX}"="1" ]

c'est OK

Reply

Marsh Posté le 19-06-2005 à 03:01:27    

couak a écrit :

les tests d'égalité en shell ne doivent pas contenir d'espace


C'est totalement faux. Tu dois confondre avec le "=" d'affectation (var=value).

Reply

Marsh Posté le 19-06-2005 à 09:27:01    

matafan a écrit :

C'est totalement faux. Tu dois confondre avec le "=" d'affectation (var=value).


 
+1

Reply

Marsh Posté le 19-06-2005 à 10:01:03    

man test ou man ksh qu'on en finisse

Reply

Marsh Posté le 10-07-2005 à 00:37:53    

Elmoricq a écrit :

Pas normal.
 
Testé des tas de fois, ça fonctionne.
 
 

Citation :

[ $CHX -eq 2 ]


 
Surtout pas, sauf si tu testes avant que $CHX n'est pas une chaîne vide, ou que tu es absolument, complètement, 100% sûr que $CHX ne sera jamais vide.  
Sinon le shell va interpréter ça comme [ -eq 2 ] et il va hurler.
Eventuellement, tu peux écrire, pour éviter toute erreur :

if [ "$CHX" -eq 2 ]


Mais personnellement je n'aime pas le mélange des genres. Ceci dit comme en shell ça n'a pas d'importance, c'est une possibilité.


Exact. et pour éviter le test de nullité :
 
if [ "x${CHX}" -eq "x2" ]


Message édité par BC-A le 10-07-2005 à 00:38:32

---------------
Traduction FR de FileZilla Server
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed