Я хотел бы иметь что-то вроде следующего:
#!/bin/sh
# ... other stuff ...
# some relatively static possibilities (srsp):
srsp='this|or|that|the|other'
# more other stuff
case $something in
$srsp) # <- problem is here
do_something # or maybe nothing
;;
this|or|that|the|other);; # this would work, but loses the benefit of a variable
*)
# anything not in my list is an error:
echo "Sorry, I don't recognize $something as one of $srsp" >&2
exit 1;;
esac
do_something | egrep "blah($srsp)thing" # or whatever
Проблема в том, что наличие $srsp
только всей строке (если бы $something
было в точности строкой "this|or|that|or|some|other|stuff"
, это совпадало бы и do_something
), а не что-либо из this
или or
или that
... и так далее: значения, которые я на самом деле хочу сопоставить.
Если я добавлю эту буквальную строку в оператор case (моя строка "это будет работать"), она будет соответствовать тому, что я хочу, чтобы она соответствовала, но я пытаюсь сохранить этот СУХОЙ, и мне нужен тот же набор строк в обычном выражение я использую позже. (Примечание: я понимаю, что то, что возможно в case
совпадения, и то, что возможно в регулярном выражении, может существенно отличаться, но в моей конкретной ситуации они совместимы с обоими. Это на самом деле просто буквы в отдельных компонентах, без подстановочных знаков, просто |
, который существует как частный случай в обеих системах.)
Так есть ли способ сделать это? Особенно без упаковки всего выражения case в eval или что-то еще? Я бы хотел сохранить это в заявлении по делу, потому что у меня есть другие дела. (Я уверен, что я мог бы реализовать обходной путь, изменив структуру и используя egrep в качестве моего теста на совпадение (if echo $something | egrep "^($srsp)$" > /dev/null
или что-то подобное). Этот вопрос о попытке найти способ сделать это, не прибегая к этому. Или окончательное знание, что это не может быть сделано, также будет правильным ответом.)
(Или я должен переключиться на Common-Lisp? ;))
Для моих нужд я был бы доволен sh
или bash
наверняка, и, возможно, zsh
, хотя, если бы был способ сделать это максимально переносимым способом (то есть sh
), это помогло бы получить лучший ответ, ИМХО.