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

Linux Discussion :

[shell] automatisation d'une boucle if ?


Sujet :

Linux

  1. #1
    Membre confirmé Avatar de Badaboumpanpan
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 202
    Par défaut [shell] automatisation d'une boucle if ?
    Bonsoir,

    Je suis débutant en programmation et j'ai une question sur une boucle if. J'ai cinq variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    variable[1]=$un
    variable[2]=$deux
    variable[3]=$trois
    variable[4]=$quatre
    variable[5]=$cinq

    Je teste ensuite si elles sont vide, car du coup les suivantes seront forcément vides :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if [ "${variable[2]}" = "" ]; then
      ttVar=1
    elif [ "${variable[3]}" = "" ]; then
      ttVar=2
    elif [ "${variable[4]}" = "" ]; then
      ttVar=3
    elif [ "${variable[5]}" = "" ]; then
      ttVar=4
    else
      ttVar=5
    fi

    Du coup, je dois construire une boucle if en conséquence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if [ $ttVar -eq 1 ]; then
      if [ $test != ${variable[1]} ]; then
        echo $test
      fi
    elif [ $ttVar -eq 2 ]; then
      if [ $test != ${variable[1]} ] && [ $test != ${variable[2]} ]; then
        echo $test
      fi
    elif ...

    Y a-t-il un moyen de simplifier ? Y a-t-il un moyen d'automatiser la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ $test != ${variable[1]} ] && [ $test != ${variable[2]} ] ...;

    Merci d'avance !!

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    1/ l'instruction if n'est pas une boucle mais un branchement conditionel.

    exemple

    si [ j'ai soif ]
    alors je bois
    sinon je ne bois pas

    en shell
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if [ $jaisoif -eq 1 ] 
    then
      jebois.ksh
    else
      jeneboispas.ksh
    fi

    autrement pous simplifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if [ $ttVar -eq 1 ]; then
      if [ $test != ${variable[1]} ]; then
        echo $test
      fi
    elif [ $ttVar -eq 2 ]; then
      if [ $test != ${variable[1]} ] && [ $test != ${variable[2]} ]; then
        echo $test
      fi
    elif ...
    tu peux utiliser un case

    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
     
    case $ttVar  in 
      1)
         if [ $test != ${variable[1]} ]; then
           echo $test
        fi
     ;;
     2)
        if [ $test != ${variable[1]} ] && [ $test != ${variable[2]} ]; then
           echo $test
        fi
     ;;
     ....
     *)
       ;;
    esac

    un lien qui te sera utile si tu es en korn shell
    http://www.versageek.com/ksh_munix.html

    ensuite ton exemple est un peu vague, avoir le script complet pour qu'on y jette un oeil serait peu etre plus efficace pour te le simplifier.

  3. #3
    Membre confirmé Avatar de Badaboumpanpan
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 202
    Par défaut
    Ok, pour le case, branchement conditionnel selon la valeur que prend la variable.
    Effectivement je vais procéder avec :

    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
    case $i in
      1)
        if [ $test != ${variable[1]} ]
        then
          echo $test
        fi
      ;;
      2)
        if [ $test != ${variable[1]} ] && [ $test != ${variable[2]} ]
        then
          echo $test
        fi
      ;;
      ...
      *)
      ;;
      esac

    Maintenant, comment je peux créer automatiquement le if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ $test != ${variable[1]} ] && [ $test != ${variable[2]} ]...
    Car j'aimerais aller au-delà de 5 variables, voir un nombre non défini. Du coup comment je peux pourrais faire ?

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    As tu penser a utiliser un vrai boucle?


    Avec une boucle while tu aurais un truc du style:

    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
     
    typeset -i  i=0
    typeset -i ok=1
     
    while [ $i -ne $ttVar ]
    do
      if [ $test != ${variable[$i]} ] 
        then
          echo $test
          ok=0;
        fi 
    done
     
     
    if [ $ok -ne 1 ]
    then
       echo "des différences ont été trouvé"
    fi

    je n'ai pas de shell sous la main, j'ai pu faire quelques erreurs de syntaxe, mais l'idée est là

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Badaboumpanpan Voir le message
    Y a-t-il un moyen de simplifier ? Y a-t-il un moyen d'automatiser la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ $test != ${variable[1]} ] && [ $test != ${variable[2]} ] ...;

    Merci d'avance !!
    La solution de Jabbounet est excellente. Tu veux regarder si une variable est différente de 5 autres variables, tu utilises une vraie boucle.

    Sinon voici quelques astuces d'écriture
    1) l'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if condition
    then
         instruction
    fi
    peut s'écrire plus simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    condition && instruction
    2) la comparaison d'une variable avec "vide" peut se faire directement avec "test -z"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test "$variable" = ""
    s'écrit plus simplement Pour le reste, il faut travailler l'algorithmique
    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]

  6. #6
    Membre confirmé Avatar de Badaboumpanpan
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 202
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    As tu penser a utiliser un vrai boucle?

    Avec une boucle while tu aurais un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while [ $i -ne $ttVar ]
    do
    ...
    je n'ai pas de shell sous la main, j'ai pu faire quelques erreurs de syntaxe, mais l'idée est là
    Super !!! C'est exactement ça !!!

    Au fait, je ne t'ai pas remercié pour le lien qui correspond à ce que je cherchais depuis pas mal de temps !!! Complet et avec toutes les syntaxes de boucles et conditions !!


    Sve@r merci pour l'astuce du -z !!!
    Juste une question, lorsque je teste l'existence d'un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [[ -e $filename ]]
    then
        instruction
    fi
    Cela de devient ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -e $filename && instruction
    Et comment fait-on dans le cas de plusieurs instruction ?

  7. #7
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Ne pas oublier d'ajouter les commentaires qui vont bien car si quelqu'un qui n'a pas l'habitude de lire des scripts tombe dessus, il pourra se poser des question.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Badaboumpanpan Voir le message
    Juste une question, lorsque je teste l'existence d'un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [[ -e $filename ]]
    then
        instruction
    fi
    Cela devient ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -e $filename && instruction
    Presque...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ -e $filename ]] && instruction
    Citation Envoyé par Badaboumpanpan Voir le message
    Et comment fait-on dans le cas de plusieurs instruction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    condition && (instruction1; instruction2; instruction3)
    Mais pour des raisons de maintenance et de visibilité, vaut mieux éviter et revenir à la syntaxe classique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if condition
    then
        instruction1
        instruction2
        instruction3
    fi
    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]

Discussions similaires

  1. automatiser une boucle itérative
    Par laroche1 dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/01/2008, 16h42
  2. [Script Shell] Automatiser une installation de package avec su -/sudo
    Par paco69 dans le forum Administration système
    Réponses: 1
    Dernier message: 25/10/2007, 11h19
  3. [Shell] awk dans une boucle while
    Par Shiva dans le forum Linux
    Réponses: 4
    Dernier message: 22/07/2007, 16h28
  4. une boucle en shell
    Par dams78 dans le forum Linux
    Réponses: 2
    Dernier message: 24/12/2006, 16h55
  5. Shell - Erreur dans une boucle for
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 11/01/2006, 13h45

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