p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 482
    Points : 741
    Points
    741

    Par défaut Comment vérifier si une valeur est incluse dans un tableau

    Bonjour, une autre proposition pour la FAQ :

    Pour les versions de bash inférieures à la version 4 (/bin/bash --version), les tableaux sont relativement difficilement manipulables.

    Si l'on souhaite savoir si une valeur (needle) est incluse dans un tableau (array), voila une solution avec un parcours des valeurs du tableau (plus fiable qu'un grep):

    Une solution simple en bash :
    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
     
    #!/bin/bash
    function in_array() {
      local x
      local needle=$1
      shift 1
      local ARRAY=( "$@" )
     
      [ -z "${ARRAY}" ] && return 1
      [ -z "${needle}" ] && return 1
      for x in ${ARRAY[@]}; do
        [ "${x}" == "${needle}" ] && return 0
      done
      return 1
    }
    Exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tmp_arr=( "1" "11" "12" "13" )
     
    for needle in $(seq 0 14)
    ## alternative bourne: for needle in {1..14}
    do
       in_array "${needle}" "${tmp_arr[@]}"
       RET=$?
       [ "${RET}" -eq 0 ] && echo "ok : $needle est dans le tableau" || echo "Nok  $needle pas trouvé dans le tableau"
    done
    Nota: à adapter en bourne shell.

  2. #2
    Modérateur
    Avatar de N_BaH
    Inscrit en
    février 2008
    Messages
    3 893
    Détails du profil
    Informations forums :
    Inscription : février 2008
    Messages : 3 893
    Points : 9 813
    Points
    9 813

    Par défaut

    sans avoir poussé les tests très loin, je propose quelques modifications :
    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
    $ function in_array() {
    # définition de variables propres à la fonction et isolées du reste du script
       local x needle="$1"
    # effacement du premier paramètre positionnel
       shift
    # y a-t-il au moins un élément au tableau passé en argument
       if [ -n "$1" ]
    # alors, pour x dans les paramètres positionnels (in "@" est implicite)
       then for x
            do [ "$x" = "$needle" ] && { echo 1; return;}
    # l'évaluation arithmétique retournera vrai
            done
       fi
    #le else est implicite, et si la boucle for va jusqu'au terme de sa liste
       echo 0
    # l'évaluation arithmétique retournera faux
    }
    $ needle=bla Array=(foo bar bla baz)
    $ (( $(in_array $needle "${Array[@]}") )) && echo "$needle est dans \"${Array[@]}\""
    bla est dans "foo bar bla baz"
    $ (( $(in_array autre "${Array[@]}") )) && echo "$needle est dans \"${Array[@]}\""
    $

  3. #3
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 482
    Points : 741
    Points
    741

    Par défaut

    Merci , c'est nettement plus synthétique que ma version "simpliste", mais aussi nettement moins lisible par le plus grand nombre (contexte de FAQ avec des lecteurs qui débutent et pas des ultra spécialistes), pour au final, un même résultat me semble-t-il. Ou bien ai-je commis une boulette ?

Discussions similaires

  1. Réponses: 14
    Dernier message: 05/01/2011, 23h17
  2. Vérifier si une valeur est dans un tableau croisé dynamique
    Par psykodumarteau dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 01/07/2008, 13h39
  3. Réponses: 11
    Dernier message: 16/12/2007, 16h33
  4. Comment vérifier qu'une valeur est NULL ?
    Par innova dans le forum MS SQL-Server
    Réponses: 2
    Dernier message: 20/11/2006, 14h53
  5. Réponses: 2
    Dernier message: 17/08/2005, 14h40

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