569 votes

Vérifier si un tableau contient une valeur

Dans Bash, quel est le moyen le plus simple de tester si un tableau contient une certaine valeur?

EDIT : avec l'aide des réponses et des commentaires, après quelques tests, j'ai trouvé ceci:

 function contains() {
    local n=$#
    local value=${!n}
    for ((i=1;i < $#;i++)) {
        if [ "${!i}" == "${value}" ]; then
            echo "y"
            return 0
        fi
    }
    echo "n"
    return 1
}

A=("one" "two" "three four")
if [ $(contains "${A[@]}" "one") == "y" ]; then
    echo "contains one"
fi
if [ $(contains "${A[@]}" "three") == "y" ]; then
    echo "contains three"
fi
 

Je ne suis pas sûr que ce soit la meilleure solution, mais cela semble fonctionner.

626voto

Keegan Points 210

Je suis un peu surpris que personne n'ait encore proposé cette solution, même si elle a été suggérée par un couple. Il a l'avantage de ne pas avoir besoin de faire une boucle sur tous les éléments (du moins pas explicitement, je ne suis pas sûr de savoir comment bash implémente [@] ).

 if [[ "${arr[@]}" =~ "${value} " || "${arr[${#arr[@]}-1]}" == "${value}" ]]; then
    # whatever you want to do when arr contains value
else
    # whatever you want to do when arr doesn't contain value
fi
 

Serait-ce plus efficace que les solutions déjà proposées?

435voto

patrik Points 701

Voici une petite fonction pour y parvenir. La chaîne de recherche est le premier argument et le reste les éléments du tableau:

 containsElement () {
  local e
  for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
  return 1
}
 

Un test de cette fonction pourrait ressembler à ceci:

 $ array=("something to search for" "a string" "test2000")
$ containsElement "a string" "${array[@]}"
$ echo $?
0
$ containsElement "blaha" "${array[@]}"
$ echo $?
1
 

60voto

Scott Points 823
 for i in "${array[@]}"
do
    if [ "$i" -eq "$yourValue" ] ; then
        echo "Found"
    fi
done
 

Pour les chaînes:

 for i in "${array[@]}"
do
    if [ "$i" == "$yourValue" ] ; then
        echo "Found"
    fi
done
 

59voto

ghostdog74 Points 86060
$ myarray=(one two three)
$ case "${myarray[@]}" in  *"two"*) echo "found" ;; esac
found

4voto

bta Points 22525

Il y a un exemple de code qui montre comment remplacer une sous-chaîne à partir d'un tableau. Vous pouvez faire une copie du tableau et essayer de supprimer la valeur cible de la copie. Si la copie et l'original sont alors différents, alors la valeur cible existe dans la chaîne d'origine.

Le simple (mais potentiellement plus de temps) la solution est de simplement parcourir l'ensemble du tableau et vérifier chaque élément individuellement. C'est ce que je fais parce que c'est facile à mettre en œuvre et vous pouvez l'envelopper dans une fonction (voir cette info sur le passage d'un tableau à une fonction).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X