Próbuję użyć zmiennej składającej się z różnych ciągów znaków oddzielonych |
za pomocą case
testu instrukcji. Na przykład:
string="\"foo\"|\"bar\""
read choice
case $choice in
$string)
echo "You chose $choice";;
*)
echo "Bad choice!";;
esac
Chcę być w stanie wpisać foo
lub bar
wykonać pierwszą część case
instrukcji. Jednak oba foo
i bar
zabierzcie mnie do drugiego:
$ foo.sh
foo
Bad choice!
$ foo.sh
bar
Bad choice!
Używanie "$string"
zamiast $string
nie robi różnicy. Nie używa też string="foo|bar"
.
Wiem, że mogę to zrobić w ten sposób:
case $choice in
"foo"|"bar")
echo "You chose $choice";;
*)
echo "Bad choice!";;
esac
Mogę wymyślić różne obejścia, ale chciałbym wiedzieć, czy można użyć zmiennej jako case
warunku w bash. Czy to możliwe, a jeśli tak, to w jaki sposób?
read
kawałek mnie powstrzymał. Moim zdaniem sprawdzanie poprawności danych wejściowych przez użytkownika, czyli takie, jak się wydaje, case
wzorce nie powinny znajdować się na górze listy oceny, a raczej powinny być przycinane do *
domyślnego wzorca, tak aby zagwarantować, że jedyne osiągnięte wyniki są gwarantowane. nadal, ponieważ problemem jest kolejność parsowania / rozbudowy, może być potrzebna druga ocena.
eval
, uciekając $ wybór, nawiasy, gwiazdka, średników i znaków nowej linii. Brzydkie, ale „działa”.