bash: teste si $ WORD est en set

Je cherche une construction dans bash , pour décider si une variable $WORD est l'un des mots définis. J'ai besoin de quelque chose comme ça:

 if "$WORD" in dog cat horse ; then echo yes else echo no fi 

est-ce que bash a une telle construction? Sinon, quel serait le plus proche?

Il s'agit d'une solution Bash-only (> = version 3) qui utilise des expressions régulières:

 if [[ "$WORD" =~ ^(cat|dog|horse)$ ]]; then echo "$WORD is in the list" else echo "$WORD is not in the list" fi 

Si votre list de mots est longue, vous pouvez la stocker dans un file (un mot par ligne) et faire ceci:

 if [[ "$WORD" =~ $(echo ^\($(paste -sd'|' /your/file)\)$) ]]; then echo "$WORD is in the list" else echo "$WORD is not in the list" fi 

Une mise en garde avec l'approche de file:

  • Il se casse si le file contient des espaces. Cela peut être corrigé par quelque chose comme:

     sed 's/[[:blank:]]//g' /your/file | paste -sd '|' /dev/stdin 

Merci à @terdon de me callbacker de bien ancrer le patron avec ^ et $ .

 case $word in dog|cat|horse) echo yes;; *) echo no;; esac 

Que diriez-vous:

 #!/usr/bin/env bash WORD="$1" for w in dog cat horse do if [ "$w" == "$WORD" ] then yes=1 break fi done; [ "$yes" == "1" ] && echo "$WORD is in the list" || echo "$WORD is not in the list" 

Alors:

 $ a.sh cat cat is in the list $ a.sh bob bob is not in the list 
 if (echo "$set" | fgrep -q "$WORD") 

Vous pouvez définir une fonction bash pour cela:

 function word_valid() { if [ "$1" != "cat" -a "$1" != "dog" -a "$1" != "horse" ];then echo no else echo yes fi } 

Ensuite, utilisez simplement comme ceci:

 word_valid cat 

Cela a fonctionné pour moi:

 #!/bin/bash phrase=(cat dog parrot cow horse) findthis=parrot for item in ${phrase[*]} do test "$item" == "$findthis" && { echo "$findthis found!"; break; } done 

Vous voudrez peut-être mettre la list des mots dans un file, au cas où vous changeriez souvent la list, ou si vous voulez qu'elle soit partagée par plusieurs scripts. Et vous devrez peut-être mettre les mots dans un file si la list est trop longue à gérer dans un script. Alors vous pouvez dire

 if fgrep –qx "$WORD" word_list 

Si les mots sont une list où les valeurs sont séparées par une nouvelle ligne, vous pouvez faire:

 WORDS="$(ls -1)" if echo "${WORDS}" | grep --quiet --line-regexp --fixed-ssortingngs "${WORD}"; then echo yes else echo no fi 

je cherchais une solution «une ligne» pour valider mon argument de script, et j'ai utilisé la réponse de Joseph R. ci-dessus pour find:

[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }