Использование переменной в качестве шаблона 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
Ответы
Ответ 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'