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 ; }