Próbuję użyć zmiennej składającej się z różnych ciągów znaków oddzielonych |za pomocą casetestu 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ć foolub barwykonać pierwszą część caseinstrukcji. Jednak oba fooi barzabierzcie mnie do drugiego:
$ foo.sh
foo
Bad choice!
$ foo.sh
bar
Bad choice!
Używanie "$string"zamiast $stringnie 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 casewarunku w bash. Czy to możliwe, a jeśli tak, to w jaki sposób?
readkawałek mnie powstrzymał. Moim zdaniem sprawdzanie poprawności danych wejściowych przez użytkownika, czyli takie, jak się wydaje, casewzorce 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”.