Estoy buscando un operador "in" que funcione de esta manera:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Obviamente, es una declaración mucho más corta en comparación con, por ejemplo, el uso de varias pruebas "o".
bash
shell-script
bourne-shell
mrjayviper
fuente
fuente
=~
no es válido dentro de la prueba POSIX de un solo corchete[
es POSIX, pero[[
es característica extendida de bash, ksh (al parecer se originó a partir de ahí, y zsh.case
ejemplo es más POSIX de todo, sin embargocase "$1" in
No es necesario citar $ 1 en , no se realizan divisiones de palabras ni expansión de nombre de ruta en ese token.No hay una prueba "in" en bash, pero hay una prueba regex (no en bourne):
Y generalmente escrito usando una variable (menos problemas con las citas):
Para un shell Bourne anterior, debe usar una coincidencia de mayúsculas y minúsculas:
fuente
Usar a
case
está bien y está bien si tienes un conjunto fijo de mascotas con las que quieres hacer coincidir. Pero no funcionará si necesita construir el patrón en tiempo de ejecución, yacase
que no interpreta la alternancia desde dentro de los parámetros expandidos.Esto solo coincidirá con la cadena literal
cat|dog|mouse
:Sin embargo, puede usar una variable con la coincidencia de expresión regular. Mientras no se cite la variable, cualquier operador de expresiones regulares dentro de ella tiene sus significados especiales.
También podría usar matrices asociativas. Verificar si existe una clave en uno es lo más cercano a un
in
operador que Bash le da. Aunque la sintaxis es un poco fea:(se
${arr[$1]+x}
expande ax
siarr[$1]
está configurado, de lo contrario se vacía ) .fuente
Usted podría utilizar una
case
declaración en unaif
prueba, pero el código se vería un poco peluda:o un poco más corto
Esto está usando una
case
cláusula solo para hacer la coincidencia de patrón para laif
cláusula. Introduce una prueba verdadera / falsa innecesaria.Es mejor simplemente usar
case
:No hagas esto:
o esto:
... porque solo está agregando información más peligrosa, solo para poder usar una
if
declaración en su código en lugar de unacase
declaración perfectamente razonable .fuente
eval
de lascase
declaraciones en ese caso, y sería aún más propenso a errores."$1"|"$2"|"$3"
. También unix.stackexchange.com/a/234415/85039 Pero sí, es un poco peludo.grep
Acercarse.-q
para evitar cualquier salida a la pantalla (más rápido para escribir que>/dev/null
).-E
para(cat|dog|mouse)
aspectos de expresiones regulares extendidas necesita esto.^(cat|dog|mouse)$
coincide con cualquier línea que comience (^
) con gato, perro o mouse ((cat|dog|mouse)
) seguido del final de la línea ($
)fuente