Je recherche un opérateur «in» qui fonctionne comme ceci:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
C'est évidemment une déclaration beaucoup plus courte par rapport à, disons, l'utilisation de plusieurs tests "ou".
bash
shell-script
bourne-shell
mrjayviper
la source
la source
=~
n'est pas valide dans le test de parenthèse simple POSIX[
est POSIX, mais[[
est une fonctionnalité étendue de bash, ksh (apparemment, il est originaire de là, et zsh. l'case
exemple est le plus POSIX de tous, cependantcase "$1" in
n'a pas besoin d'être cité, aucun fractionnement de mot ni expansion de nom de chemin ne sont effectués dans ce jeton.Il n'y a pas de test "in" en bash, mais il y a un test regex (pas en bourne):
Et généralement écrit à l'aide d'une variable (moins de problèmes de citation):
Pour un shell Bourne plus ancien, vous devez utiliser une correspondance de casse:
la source
L'utilisation d'un
case
est très bien si vous avez un ensemble fixe d'animaux contre lesquels vous voulez faire correspondre. Mais cela ne fonctionnera pas si vous avez besoin de construire le modèle lors de l'exécution, car ilcase
n'interprète pas l'alternance à partir des paramètres développés.Cela correspondra uniquement à la chaîne littérale
cat|dog|mouse
:Vous pouvez cependant utiliser une variable avec la correspondance d'expression régulière. Tant que la variable n'est pas citée, tous les opérateurs d'expression régulière qu'elle contient ont leur signification particulière.
Vous pouvez également utiliser des tableaux associatifs. Vérifier si une clé existe dans l'une est la chose la plus proche d'un
in
opérateur que Bash donne. Bien que la syntaxe soit un peu moche:(se
${arr[$1]+x}
développe enx
siarr[$1]
est défini, vide sinon. )la source
Vous pourriez utiliser une
case
instruction dans unif
test, mais le code aurait l'air un peu poilu:ou légèrement plus court,
Ceci utilise une
case
clause juste pour faire la correspondance de modèle pour laif
clause. Il introduit un test vrai / faux inutile.Il vaut mieux simplement utiliser
case
:Ne faites pas ça:
ou ca:
... parce que vous ajoutez simplement une cruauté plus dangereuse, juste pour pouvoir utiliser une
if
déclaration dans votre code à la place d'unecase
déclaration parfaitement raisonnable .la source
eval
de lacase
déclaration dans ce cas, et il serait encore plus sujettes à des erreurs."$1"|"$2"|"$3"
. Aussi unix.stackexchange.com/a/234415/85039 Mais oui, c'est un peu poilu.grep
approche.-q
pour éviter toute sortie à l'écran (plus rapide à taper que>/dev/null
).-E
pour les expressions régulières étendues, les(cat|dog|mouse)
aspects en ont besoin.^(cat|dog|mouse)$
correspond à toutes les lignes commençant par (^
) par chat, chien ou souris ((cat|dog|mouse)
) suivi de fin de ligne ($
)la source