IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

if test problem


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut if test problem
    Bonjour à tous,
    J'ecris un petit script bash, et je rencontre quelques difficulté. Je pense que le problème vient de ma condition dans le if :
    Voici un morceau du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    if [ "$nb" -lt "$pi_sens_region_gene" ] && [ -s "tmp_no_exon_FBgn0003028.bed" ];
    				echo "exon exist"
    				then
    					ligne_pi_3UTR=`intersectBed -a tmp_no_exon_FBgn0003028.bed -b 3UTR_FBgn_controle_13.bed -wa -wb | grep 'FBgn0003028' | cut -f 4 | sort -u | wc -l`
    					intersectBed -a tmp_no_exon_FBgn0003028.bed -b 3UTR_FBgn_controle_13.bed -v > tmp_no_3UTR_FBgn0003028.bed
    					nb=$(($nb+$ligne_pi_3UTR))
    					echo "nb apres then 3UTR " $nb
    				elif [ "$nb" -lt "$pi_sens_region_gene" ] && [ ! -s "tmp_no_exon_FBgn0003028.bed" ] &&  [ -s "tmp_no_intron_FBgn0003028.bed" ];   
    					echo "tmp_no_exon_FBgn0003028.bed n exist pas , mais intron existe "
    					then
    					ligne_pi_3UTR=`intersectBed -a tmp_no_intron_FBgn0003028.bed -b 3UTR_$nom.bed -wa -wb | grep 'FBgn0003028' | cut -f 4 | sort -u | wc -l`
    					intersectBed -a tmp_no_intron_FBgn0003028.bed -b 3UTR_FBgn_controle_13.bed -v > tmp_no_3UTR_FBgn0003028.bed
    					nb=$(($nb+$ligne_pi_3UTR))
    					echo "nb apres elif 3UTR :" $nb
    				else [ "$nb" -lt "$pi_sens_region_gene" ] && [ ! -s "tmp_no_exon_FBgn0003028.bed" ] && [ ! -s "tmp_no_intron_FBgn0003028.bed" ] ;
    					echo "ni exon ni intron exist "
    					ligne_pi_3UTR=`intersectBed -a pi_sens_gene_region_FBgn0003028.bed -b 3UTR_FBgn_controle_13.bed -wa -wb | grep 'FBgn0003028' | cut -f 4 | sort -u | wc -l`
    					intersectBed -a pi_sens_gene_region_FBgn0003028.bed -b 3UTR_FBgn_controle_13.bed -v > tmp_no_3UTR_FBgn0003028.bed
    					nb=$(($nb+$ligne_pi_3UTR))
    					echo "nb apres else 3UTR :" $nb		
     
    			fi
    Je pense qu'en fait toutes les conditions du if ne sont pas respectée, est ce que la syntaxe est correcte ?

  2. #2
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    Salut,

    Ligne 15: il ne peut pas y avoir de test après "else".
    Soit il faut enlever le test, soit remplacer else par elif.

    Et puis cette syntaxe me semble bizarre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [ "$nb" -lt "$pi_sens_region_gene" ] && [ -s "tmp_no_exon_FBgn0003028.bed" ];
    				echo "exon exist"
    				then
                                    ...
    Qu'est ce que ce echo vient faire entre if et then ??? et aussi le ';' ?

    jmv

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Je plussoie !

    Attention! Tout ce code est tout à fait permis (et ne provoque probablement pas d'erreur); il m'arrive même d'utiliser des trucs du même genre, mais avec des pincettes!

    Le test du 'if' est la séquence d'instructions [ "$nb" -lt "$pi_sens_region_gene" ] && [ -s "tmp_no_exon_FBgn0003028.bed" ]; echo "exon exist" qui compare "$nb" et, le cas échéant, vérifie la taille du fichier, puis, dans tous les cas, affiche "exon exist", lequel retourne toujours 0.
    Donc, dans tous les cas, le 'if' exécute le corps du 'then' et ne passe donc jamais dans les 'elif'.

    Lorsqu'on demande à un (bon) éditeur (comme emacs ou vim) d'indenter le code tout seul, comme un grand, on obtient ceci, qui peut mettre la puce à l'oreille:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    if [ "$nb" -lt "$pi_sens_region_gene" ] && [ -s "tmp_no_exon_FBgn0003028.bed" ];
        echo "exon exist"
    then
        ligne_pi_3UTR=`intersectBed -a tmp_no_exon_FBgn0003028.bed -b 3UTR_FBgn_controle_13.bed -wa -wb | grep 'FBgn0003028' | cut -f 4 | sort -u | wc -l`
        intersectBed -a tmp_no_exon_FBgn0003028.bed -b 3UTR_FBgn_controle_13.bed -v > tmp_no_3UTR_FBgn0003028.bed
        nb=$(($nb+$ligne_pi_3UTR))
        echo "nb apres then 3UTR " $nb
    elif [ "$nb" -lt "$pi_sens_region_gene" ] && [ ! -s "tmp_no_exon_FBgn0003028.bed" ] &&  [ -s "tmp_no_intron_FBgn0003028.bed" ];   
        echo "tmp_no_exon_FBgn0003028.bed n exist pas , mais intron existe "
    then
        ligne_pi_3UTR=`intersectBed -a tmp_no_intron_FBgn0003028.bed -b 3UTR_$nom.bed -wa -wb | grep 'FBgn0003028' | cut -f 4 | sort -u | wc -l`
        intersectBed -a tmp_no_intron_FBgn0003028.bed -b 3UTR_FBgn_controle_13.bed -v > tmp_no_3UTR_FBgn0003028.bed
        nb=$(($nb+$ligne_pi_3UTR))
        echo "nb apres elif 3UTR :" $nb
    else [ "$nb" -lt "$pi_sens_region_gene" ] && [ ! -s "tmp_no_exon_FBgn0003028.bed" ] && [ ! -s "tmp_no_intron_FBgn0003028.bed" ] ;
        echo "ni exon ni intron exist "
        ligne_pi_3UTR=`intersectBed -a pi_sens_gene_region_FBgn0003028.bed -b 3UTR_FBgn_controle_13.bed -wa -wb | grep 'FBgn0003028' | cut -f 4 | sort -u | wc -l`
        intersectBed -a pi_sens_gene_region_FBgn0003028.bed -b 3UTR_FBgn_controle_13.bed -v > tmp_no_3UTR_FBgn0003028.bed
        nb=$(($nb+$ligne_pi_3UTR))
        echo "nb apres else 3UTR :" $nb		
    fi
    ce n'est probablement pas ce que tu veux faire!

    Déplace les 2 echo (avant le premier 'then' et avant le 2ème 'then') après le 'then' respectif.

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Sinon je sais que ça marche mais quand on fait des comparaisons de valeurs numériques avec les opérateurs -lt, le, -gt, -ge, -ne, -eq je ne suis pas fan avec les " autour des variables qui me font penser à un test de chaine de caractères (donc induisent en erreur d'une certaine manière sur le contenu des variables).

    Les " sont surtout nécessaires quand il s'agit de test sur les chaînes avec les opérateurs =, != et =~ entre autres.

    Idriss

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    les guillemets ne sont pas nécessaires avec =~, car cet opérateur ne peut être utiliser qu'avec [[, qui protège les chaînes par lui-même (autant à gauche qu'à droite).
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jmv Voir le message
    Salut,
    Qu'est ce que ce echo vient faire entre if et then ??? et aussi le ';' ?

    jmv
    Salut
    C'est autorisé mais comme le dit jack-ft, ça fait foirer le test.

    Le principe général du if est if commande_unix. Si la commande renvoie un statut 0, le if est vrai sinon il ne l'est pas.
    Généralement on voit if test car le test est la commande unix la plus générale pour évaluer des trucs. Mais parfois on peut mettre autre chose pour évaluer des trucs que test ne sait pas faire...
    Exemple if expr $a + 0 1>/dev/null 2>&1 sera vrai si $a est un nombre entier et faux dans le cas contraire (sauf si $a vaut 0 cause petit souci avec expr qui renvoie 1 dans ce cas mais c'était juste pour illustrer)

    Et donc ici on entre dans ce cas sauf que la commande unix est en fait 2 commandes à suivre séparées par un point-virgule
    • L'évaluation de $nb et de la taille du fichier
    • L'affichage du message

    Cette seconde commande étant exécutée en dernier, le if évalue le statut de cette dernière et comme celui-ci est 0, rentre dans le then et jamais dans le else.

    Solution de base effectivement: mettre le echo dans le then ce qui le sort du if
    Solution pour celui qui veut se la jouer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if test $nb -lt $pi_sens_region_gene && test -s "tmp_no_exon_FBgn0003028.bed" && echo "exon exist"
    then
        ...
    fi
    D'accord aussi avec la remarque sur les guillemets associés avec l'opérateur -lt

    PS: j'aime pas trop utiliser les crochets alias du test car ils font perdre de vue la notion essentielle de la syntaxe if commande...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Généralement on voit if test car le test est la commande unix la plus générale pour évaluer des trucs. Mais parfois on peut mettre autre chose pour évaluer des trucs que test ne sait pas faire...

    PS: j'aime pas trop utiliser les crochets alias du test car ils font perdre de vue la notion essentielle de la syntaxe if commande...
    Tout à fait, mon cher Thierry!

    Cette syntaxe est tellement oubliée que je trouve très fréquemment des commandes du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if [[ $(fgrep truc file | wc -l) -gt 0 ]] # À éviter absolument!!!
    then blabla ; else pablabla ; fi
    un peu moins pire (sic!):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if [[ $(fgrep -c truc file) -gt 0 ]] # À éviter aussi!!!
    then blabla ; else pablabla ; fi
    Beaucoup mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if fgrep -q truc file # Oui!!!
    then blabla ; else pablabla ; fi

Discussions similaires

  1. Probleme de htaccess, notament test en local
    Par Gireg dans le forum Apache
    Réponses: 4
    Dernier message: 31/08/2005, 00h38
  2. probleme test presence d'un fichier(avec fso)
    Par pagez dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 30/08/2005, 15h24
  3. probleme de teste sur recordset
    Par julio_097 dans le forum ASP
    Réponses: 3
    Dernier message: 18/07/2005, 11h02
  4. [WSAD 5.0] [Envirronement de test] probleme de serveur
    Par arnaud dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 12/07/2004, 14h37
  5. Probleme de test dans un boucle
    Par PrinceMaster77 dans le forum ASP
    Réponses: 14
    Dernier message: 15/06/2004, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo