Много людей использует их для частных переменных свойства (переменные, которые на самом деле хранят значения для общественных собственностей).
Ваш шаблон на самом деле является списком шаблонов, и разделитель |
должен быть указан буквально. Ваш единственный вариант - eval
. Однако постарайтесь этого избежать, если можете.
Это должно работать:
PATTERN="foo|bar|baz|bla"
shopt -s extglob
case "foo" in
@($(echo $PATTERN)))
printf "matched\n"
;;
*)
printf "no match\n"
;;
esac
Некоторые версии expr
(например, GNU) позволяют сопоставление с образцом с чередованием.
PATTERN="foo\|bar\|baz"
VALUE="bar"
expr "$VALUE" : "$PATTERN" && echo match || echo no match
В противном случае я бы использовал такой инструмент, как awk:
awk -v value="foo" -v pattern="$PATTERN" '
BEGIN {
if (value ~ pattern) {
exit 0
} else {
exit 1
}
}'
или более кратко:
awk -v v="foo" -v p="$PATTERN" 'BEGIN {exit !(v~p)}'
Вы можете использовать его так:
PATTERN="foo|bar|baz"
VALUE=oops
matches() { awk -v v="$1" -v p="$2" 'BEGIN {exit !(v~p)}'; }
if matches "$VALUE" "$PATTERN"; then
echo match
else
echo no match
fi
В Bash можно использовать сопоставление регулярных выражений:
PATTERN="foo|bar|baz|bla"
if [[ "foo" =~ $PATTERN ]]
then
printf "matched\n"
elif . . .
. . .
elif . . .
. . .
else
printf "no match\n"
fi
«Отсюда вы не доберетесь»
Мне нравится использовать регистр для сопоставления с образцом, но в этой ситуации вы выходите за рамки того, для чего подходит оболочка Борна.
есть два приема для решения этой проблемы:
за счет вилки, вы можете использовать egrep
pattern="this|that|those"
if
echo "foo" | egrep "$pattern" > /dev/null 2>&1
then
echo "found"
else
echo "not found"
fi
. Вы также можете сделать это только с помощью встроенных модулей, используя цикл. В зависимости от ситуации это может привести к тому, что ваш код будет работать в миллиард раз медленнее, поэтому убедитесь, что вы понимаете, что происходит с кодом.
pattern="this|that|those"
IFS="|" temp_pattern="$pattern"
echo=echo
for value in $temp_pattern
do
case foo
in
"$list") echo "matched" ; echo=: ; break ;;
esac
done
$echo not matched
Это, несомненно, шоу ужасов, пример того, как сценарии оболочки могут быстро выйти из-под контроля, если вы попытаетесь сделать что-нибудь, даже немного не имеющее отношения к карте ..