оболочка, соответствующая шаблону с помощью оператора выбора, который хранится в переменной

Много людей использует их для частных переменных свойства (переменные, которые на самом деле хранят значения для общественных собственностей).

8
задан Jonathan Leffler 16 September 2011 в 06:01
поделиться

5 ответов

Ваш шаблон на самом деле является списком шаблонов, и разделитель | должен быть указан буквально. Ваш единственный вариант - eval . Однако постарайтесь этого избежать, если можете.

1
ответ дан 5 December 2019 в 22:19
поделиться

Это должно работать:

PATTERN="foo|bar|baz|bla"

shopt -s extglob

case "foo" in
    @($(echo $PATTERN)))
        printf "matched\n"
        ;;
    *)
        printf "no match\n"
        ;;
esac
3
ответ дан 5 December 2019 в 22:19
поделиться

Некоторые версии 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
0
ответ дан 5 December 2019 в 22:19
поделиться

В Bash можно использовать сопоставление регулярных выражений:

PATTERN="foo|bar|baz|bla"

if [[ "foo" =~ $PATTERN ]]
then
    printf "matched\n"
elif . . .
    . . .
elif . . .
    . . .
else
    printf "no match\n"
fi
0
ответ дан 5 December 2019 в 22:19
поделиться

«Отсюда вы не доберетесь»

Мне нравится использовать регистр для сопоставления с образцом, но в этой ситуации вы выходите за рамки того, для чего подходит оболочка Борна.

есть два приема для решения этой проблемы:

за счет вилки, вы можете использовать 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

Это, несомненно, шоу ужасов, пример того, как сценарии оболочки могут быстро выйти из-под контроля, если вы попытаетесь сделать что-нибудь, даже немного не имеющее отношения к карте ..

1
ответ дан 5 December 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: