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.caseejemplo es más POSIX de todo, sin embargocase "$1" inNo 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
caseestá 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, yacaseque 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
inoperador que Bash le da. Aunque la sintaxis es un poco fea:(se
${arr[$1]+x}expande axsiarr[$1]está configurado, de lo contrario se vacía ) .fuente
Usted podría utilizar una
casedeclaración en unaifprueba, pero el código se vería un poco peluda:o un poco más corto
Esto está usando una
casecláusula solo para hacer la coincidencia de patrón para laifclá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
ifdeclaración en su código en lugar de unacasedeclaración perfectamente razonable .fuente
evalde lascasedeclaraciones 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.grepAcercarse.-qpara evitar cualquier salida a la pantalla (más rápido para escribir que>/dev/null).-Epara(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