Précédent   Forum du club des développeurs et IT Pro > Systèmes > Linux > Contribuez
Contribuez Vos contributions pour la rubrique Linux : articles, cours, tutoriels, faq, comparatifs, tests, sources, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/02/2011, 22h33   #1
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
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.
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/03/2011, 00h14   #2
N_BaH
Modérateur
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 756
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 756
Points : 6 622
Points : 6 622
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[@]}\""
$
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 01/03/2011, 01h32   #3
hornetbzz
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 481
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 481
Points : 719
Points : 719
Envoyer un message via Skype™ à hornetbzz
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 ?
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h38.


 
 
 
 
Partenaires

Hébergement Web