Подтвердить что ты не робот

Использование переменной в качестве шаблона case в Bash

Я пытаюсь написать Bash script, который использует переменную как шаблон в выражении case. Однако я просто не могу заставить его работать.

Дело:

case "$1" in
    $test)
        echo "matched"
        ;;
    *)
        echo "didn't match"
        ;;
esac

Я пробовал это с назначением $test как aaa|bbb|ccc, (aaa|bbb|ccc), [aaa,bbb,ccc] и нескольких других комбинаций. Я также пробовал их как шаблон в выражении case: @($test), @($(echo $test)), $($test). Также нет успеха.

ИЗМЕНИТЬ

Для ясности я хотел бы, чтобы переменная представляла несколько шаблонов, подобных этому:

case "$1" in
    aaa|bbb|ccc)
        echo "matched"
        ;;
    *)
        echo "didn't match"
        ;;
esac
4b9b3361

Ответ 1

Вы можете использовать опцию extglob:

#! /bin/bash

shopt -s extglob         # enables pattern lists like +(...|...)
test='+(aaa|bbb|ccc)'

for x in aaa bbb ccc ddd ; do
    echo -n "$x "
    case "$x" in
        $test) echo Matches.
        ;;
        *) echo Does not match.
    esac
done

Ответ 2

(Обновлено): здесь что-то другое, но я надеюсь, что он работает для того, что вам нужно:

#!/bin/bash

pattern1="aaa bbb ccc"
pattern2="hello world"
test=$(echo -e "$pattern1\n$pattern2" | grep -e $1)

case "$test" in
    "$pattern1")
        echo "matched - pattern1"
        ;;
    "$pattern2")
        echo "matched - pattern2"
        ;;
    *)
        echo "didn't match"
        ;;
esac

Это делает использование grep для сопоставления шаблонов для вас, но все же позволяет вам указывать несколько наборов шаблонов, которые будут использоваться в структуре case-statement.

Например:

  • Если либо aaa, bbb, либо ccc - первый аргумент script, это выведет matched - pattern1.
  • Если первый аргумент hello или world, он выведет matched - pattern2.
  • В противном случае он выведет didn't match.

Ответ 3

Использование eval также работает:

eval 'case "$1" in

    '$test')
        echo "matched"
        ;;
    *)
        echo "did not match"
        ;;
esac'