Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1586 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Korn Shell] Test d'égalité

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Korn Shell] Test d'égalité

n°1087509
Azariel
Posté le 18-05-2005 à 10:18:42  profilanswer
 

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

mood
Publicité
Posté le 18-05-2005 à 10:18:42  profilanswer
 

n°1087510
elianor
bannie 17 fois
Posté le 18-05-2005 à 10:20:21  profilanswer
 

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


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

---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
n°1087517
Azariel
Posté le 18-05-2005 à 10:24:51  profilanswer
 

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.

n°1087572
Elmoricq
Modérateur
Posté le 18-05-2005 à 11:03:23  profilanswer
 

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.

n°1088185
Azariel
Posté le 18-05-2005 à 17:11:05  profilanswer
 

Marche pas non plus ...  :cry:

n°1088214
matafan
Posté le 18-05-2005 à 17:26:21  profilanswer
 

[ $CHX -eq 2 ]

n°1088222
Elmoricq
Modérateur
Posté le 18-05-2005 à 17:31:11  profilanswer
 

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
n°1088755
Azariel
Posté le 19-05-2005 à 09:22:35  profilanswer
 

: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:

n°1088759
Elmoricq
Modérateur
Posté le 19-05-2005 à 09:27:28  profilanswer
 

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.

n°1089108
matafan
Posté le 19-05-2005 à 13:53:28  profilanswer
 

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

mood
Publicité
Posté le 19-05-2005 à 13:53:28  profilanswer
 

n°1116905
Deadlock
Feck off, cup !
Posté le 11-06-2005 à 23:33:06  profilanswer
 

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.
n°1124343
couak
Posté le 19-06-2005 à 01:59:58  profilanswer
 

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

n°1124351
matafan
Posté le 19-06-2005 à 03:01:27  profilanswer
 

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).

n°1124369
Elmoricq
Modérateur
Posté le 19-06-2005 à 09:27:01  profilanswer
 

matafan a écrit :

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


 
+1

n°1124373
Taz
bisounours-codeur
Posté le 19-06-2005 à 10:01:03  profilanswer
 

man test ou man ksh qu'on en finisse

n°1145295
BC-A
Posté le 10-07-2005 à 00:37:53  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Korn Shell] Test d'égalité

 

Sujets relatifs
Test spooler imprimanteScript shell
Base active directory de testShell script : redirection synchrone vers un fichier ?
La fonction shell() ne démarre mon prog qu'à la fin de ma fonctiondébutante en shell
Problème shell d'un débutant HELP!VBA shell
Comment zipper un fichier à partir de la fonction Shelltest valeur myquery...
Plus de sujets relatifs à : [Korn Shell] Test d'égalité


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR