206 votes

Vérifier si une variable existe dans une liste en Bash

J'essaie d'écrire un script en bash qui vérifie la validité d'une entrée utilisateur.
Je veux faire correspondre l'entrée (disons la variable x ) à une liste de valeurs valides.

Ce que j'ai trouvé pour l'instant, c'est.. :

for item in $list
do
    if [ "$x" == "$item" ]; then
        echo "In the list"
        exit
    fi
done

Ma question est de savoir s'il existe un moyen plus simple de procéder,
quelque chose comme un list.contains(x) pour la plupart des langages de programmation.

Dites la liste :

list="11 22 33"

mon code n'affichera le message que pour ces valeurs puisque list est traité comme un tableau et non comme une chaîne de caractères, toutes les manipulations de chaînes de caractères seront validées 1 alors que je voudrais qu'il échoue.

177voto

chemila Points 704
[[ $list =~ (^|[[:space:]])$x($|[[:space:]]) ]] && echo 'yes' || echo 'no'

ou créer une fonction :

contains() {
    [[ $1 =~ (^|[[:space:]])$2($|[[:space:]]) ]] && exit(0) || exit(1)
}

pour l'utiliser :

contains aList anItem
echo $? # 0: match, 1: failed

87voto

Kent Points 71470

Comment faire

echo $list | grep -w -q $x

vous pouvez soit vérifier la sortie, soit $? de la ligne ci-dessus pour prendre la décision.

grep -w vérifie les modèles de mots entiers. Ajout -q empêche l'écho de la liste.

45voto

Oriettaxx Points 76

Matvey a raison, mais vous devriez citer $x et considérer tout type d'"espace" (par exemple une nouvelle ligne) avec

[[ $list =~ (^|[[:space:]])"$x"($|[[:space:]]) ]] && echo 'yes' || echo 'no' 

donc, c'est-à-dire

# list_include_item "10 11 12" "2"
function list_include_item {
  local list="$1"
  local item="$2"
  if [[ $list =~ (^|[[:space:]])"$item"($|[[:space:]]) ]] ; then
    # yes, list include item
    result=0
  else
    result=1
  fi
  return $result
}

fin alors

`list_include_item "10 11 12" "12"`  && echo "yes" || echo "no"

ou

if `list_include_item "10 11 12" "1"` ; then
  echo "yes"
else 
  echo "no"
fi

Notez que vous devez utiliser "" en cas de variables :

`list_include_item "$my_list" "$my_item"`  && echo "yes" || echo "no"

45voto

blaimi Points 19

La solution la plus simple, selon moi, consiste à ajouter un espace à la chaîne de caractères originale et à la comparer à une expression rationnelle avec [[ ]]

haystack='foo bar'
needle='bar'

if [[ " $haystack " =~ .*\ $needle\ .* ]]; then
    ...
fi

ne sera pas faussement positif sur les valeurs contenant l'aiguille comme sous-chaîne, par exemple dans le cas d'une botte de foin. foo barbaz .

(Le concept a été volé sans vergogne à la fonction hasClass() -Méthode)

20voto

Mithun Sasidharan Points 5589

Vous pouvez également utiliser des caractères génériques (*) en dehors d'une instruction case, si vous utilisez des doubles crochets :

string='My string';

if [[ $string == *My* ]]
then
echo "It's there!";
fi

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