Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    octobre 2009
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    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 :
    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 :
    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 479
    Détails du profil
    Informations forums :
    Inscription : février 2008
    Messages : 3 479
    Points : 8 284
    Points
    8 284

    Par défaut

    sans avoir poussé les tests très loin, je propose quelques modifications :
    Code :
    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
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : octobre 2009
    Messages : 481
    Points : 665
    Points
    665

    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 ?

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •