El manual de bash dice:
palabra del caso en la lista [[(] patrón [| patrón] ...); ] ... esac
Cada patrón examinado se expande usando expansión de tilde, expansión de parámetros y variables, sustitución aritmética, sustitución de comandos y sustitución de procesos.
No «Expansión de nombre de ruta»
Por lo tanto: un patrón NO se expande con «Expansión de nombre de ruta».
Por lo tanto: un patrón NO puede contener "|" dentro. Solo: dos patrones se pueden unir con el "|".
Esto funciona:
s1="foo"; s2="bar" # or even s1="*foo*"; s2="*bar*"
read choice
case $choice in
$s1|$s2 ) echo "Two val choice $choice"; ;; # not "$s1"|"$s2"
* ) echo "A Bad choice! $choice"; ;;
esac
Usando «Globbing extendido»
Sin embargo, word
se pattern
combina con el uso de las reglas de "Expansión del nombre de ruta".
Y «Globbing extendido» aquí , aquí y, aquí permite el uso de patrones alternos ("|").
Esto también funciona:
shopt -s extglob
string='@(foo|bar)'
read choice
case $choice in
$string ) printf 'String choice %-20s' "$choice"; ;;&
$s1|$s2 ) printf 'Two val choice %-20s' "$choice"; ;;
*) printf 'A Bad choice! %-20s' "$choice"; ;;
esac
echo
Contenido de cadena
El siguiente script de prueba muestra que el patrón que coincide con todas las líneas que contienen foo
o en bar
cualquier lugar es '*$(foo|bar)*'
o las dos variables $s1=*foo*
y$s2=*bar*
Script de prueba:
shopt -s extglob # comment out this line to test unset extglob.
shopt -p extglob
s1="*foo*"; s2="*bar*"
string="*foo*"
string="*foo*|*bar*"
string='@(*foo*|*bar)'
string='*@(foo|bar)*'
printf "%s\n" "$string"
while IFS= read -r choice; do
case $choice in
"$s1"|"$s2" ) printf 'A first choice %-20s' "$choice"; ;;&
$string ) printf 'String choice %-20s' "$choice"; ;;&
$s1|$s2 ) printf 'Two val choice %-20s' "$choice"; ;;
*) printf 'A Bad choice! %-20s' "$choice"; ;;
esac
echo
done <<-\_several_strings_
f
b
foo
bar
*foo*
*foo*|*bar*
\"foo\"
"foo"
afooline
onebarvalue
now foo with spaces
_several_strings_
eval
opción de $ escapándose, los parens, el asterisco, el punto y coma y las nuevas líneas. Feo, pero "funciona".read
parte me detuvo. en mi opinión, la validación de entrada del usuario, que es lo que parece ser, loscase
patrones no deberían estar en la parte superior de la lista de evaluación, sino que deberían reducirse al*
patrón predeterminado de modo que los únicos resultados que lleguen allí sean garantizados aceptables. aún así, debido a que el problema es el orden de análisis / expansión, entonces una segunda evaluación podría ser lo que se requiere.