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

Unix Discussion :

tabeau et variable


Sujet :

Unix

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Par défaut tabeau et variable
    Bonjour,

    J'ai un tableau A et Tableau B dans lequel j'ai des valeurs. Je souhaiterai comparer les valeurs de ces 2 tableaux avec 2 variables.
    La première toto, de type numérique sera comparé dans le tableau A et la seconde titi de type Alpha sera à comparé dans le tableau B.

    Si ma variable toto est égal à l'une des valeurs du tableau A, et ma variable titi est égale à l'une des valeurs du tableau B, alors j'affiche ok. Sinon rien.



    TableauA= "1 2 3"
    TableauB= "J M T A"

    for * in
    Merci pour votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 90
    Par défaut
    Je ne travailerais pas avec une boucle "for" étant donné que tu n'as pas besoin de passer tout le tableau en revue. Tu dois juste t'arrêter après la bonne valeur.

    Puisqu'il faut rentrer au moins une fois dans la boucle pour faire un test, plutot une boucle "until" qu'une boucle "while".

    Je sais que je vais en faire hurler plus d'un , mais je travaille en ksh plutot qu'en bash.

    Cela donne donc plutot :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #!/bin/ksh
     
    # Initialisation des tables
    	TableA[1]=1
    	TableA[2]=2
    	TableA[3]=3
    	TableB[1]="J"
    	TableB[2]="M"
    	TableB[3]="T"
    	TableB[4]="A"
     
    # Element recherché 
    	SearchA=2
    	SearchB="J"
     
    # Pour la boucle et le test
    	Trouve=0
    	i=1
     
    	until [[ $i -gt ${#TableA[*]} || Trouve -eq 1 ]];do
       		if [[ $SearchA -eq ${TableA[i]} ]]; then
       			Trouve=1
    	   		else
    	   			(( i+=1 ))
       			fi
    	done
    	if [[ $Trouve -eq 1 ]]; then
    		i=1
    		Trouve=0
    		until [[ $i -gt ${#TableB[*]} || Trouve -eq 1 ]];do
       			if [[ $SearchB = ${TableB[i]} ]]; then
       				Trouve=1
    	   		else
    	   			(( i+=1 ))
       			fi
    		done
    		if [[ $Trouve -eq 1 ]]; then
    			echo "OK"
    		fi
    	fi
    A la fin de chaque boucle, si on a trouvé l'élément, alors i contient la position de l'élément dans le tableau.

    Au début j'avais pensé à une solution genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	if `echo ${TableA[*]} | grep ${SearchA} > /dev/null`; then
    		if `echo ${TableB[*]} | grep ${SearchB} > /dev/null`; then
    			echo "ok"
    		fi
    	fi
    Mais si un des éléments des tableaux contient la sous valeur de recherche (exemple TableA[2]=20 et on recherche 2) le grep va donner un réussi alors que cela ne l'est pas. J'ai essayé avec l'option -x mais cela ne donne pas le résultat escompté.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut have a `break'
    Citation Envoyé par rafuoner
    Je ne travailerais pas avec une boucle "for" étant donné que tu n'as pas besoin de passer tout le tableau en revue. Tu dois juste t'arrêter après la bonne valeur.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/bin/bash
     
    TableauA=(1 2 3) TableauB=(J M T A)
    toto=2 titi=T
    declare -i match
     
    for i in "${TableauA[@]}"
    do [ "$i" = "$toto" ] && { match+=1; break; }
    done
     
    for i in "${TableauB[@]}"
    do [ "$i" = "$titi" ] && { match+=1; break; }
    done
     
    [ $match -eq 2 ] && echo ok || echo KO
    ou encore :
    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
    #!/bin/bash
     
    TableauA=( 1 2 3 ) TableauB=( J M T A )
    toto=2 titi=T
    declare -i match
    funcFor() {
       tableau=$1 cherche=$2
       for i in $(eval echo \${$tableau[@]})
       do [ "$i" = "${!cherche}" ] && { match+=1; break; }
       done
       shift 2
       [ -n "$1" ] && funcFor $@ || {
          [ $match -eq 2 ] && echo ok || echo KO
       }
    }
    funcFor TableauA toto TableauB titi
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 90
    Par défaut oui oui le "for loop break" fonctionne...
    je ne dis pas que cela ne fonctionne pas avec un for, mais bon d'un point de vue algo, cela ne me semble pas logique de faire un "for loop break" and un repeat ou un while est là pour ca.

    J'ai cherché un plus loin pour la solution avec le grep, et je me suis gourré dans l'option. En effet "-x" c'est pour un match avec une ligne complète. Pour faire un match sur un mot complet c'est "-w".

    Bref ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if `echo ${TableA[*]} | grep -w ${SearchA} > /dev/null` && `echo ${TableB[*]} | grep -w ${SearchB} > /dev/null`; then
            echo "ok"
    fi
    fonctionne à merveille

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    je comprend...
    Code ./parseArrays : 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
    23
    24
    25
    26
    27
    28
    29
    #!/bin/bash
     
    array=( 1 2 3 4 )
    foo=3
    array2=( ga bu zo meu )
    bar="meu"
     
    Compare() {
       item="$1"
       if [ "$item" = "$search" ]; then
          ((match++))
       else
          shift
          [ -n "$1" ] && Compare "$@"
       fi
    }
    Parse() {
       arr=( $(eval echo \${$1[@]}) )
       search="${!2}"
       Compare "${arr[@]}"
       shift 2
       if [ -n "$1" ]; then
          Parse "$@"
       else
          if [ -n "$match" ] && [ $match -eq 2 ]; then echo "yes"; else echo "no"; fi
       fi
    }
     
    Parse array foo array2 bar
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Par défaut
    Si ma variable toto n'est pas égal à l'une des valeurs du tableau A, et ma variable titi n'est égale à l'une des valeurs du tableau B, alors j'affiche ces deux variables pour dire qu'elles n'appartiennent à aucun tableau.

    La solutionde RAFUNER est correcte, puisque mon script est en KSH.

    Cependant, elle affiche le cas contraire à mon besoin. Car elle affiche OK, quand ma variable est contenu dans le tableau.

    merci pour vos réponses

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/07/2002, 13h32
  2. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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