我正在尝试编写一个Bash脚本,该脚本在case语句中使用变量作为模式。但是我无法让它发挥作用。
案例陈述:
case "$1" in
$test)
echo "matched"
;;
*)
echo "didn't match"
;;
esac
我已尝试将$test
指定为aaa|bbb|ccc
,(aaa|bbb|ccc)
,[aaa,bbb,ccc]
以及其他几种组合。我还尝试将这些作为案例陈述中的模式:@($test)
,@($(echo $test))
,$($test)
。也没有成功。
修改
为清楚起见,我希望变量代表多个这样的模式:
case "$1" in
aaa|bbb|ccc)
echo "matched"
;;
*)
echo "didn't match"
;;
esac
答案 0 :(得分:19)
您可以使用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
答案 1 :(得分:3)
(更新):这里有点不同,但我希望它能满足您的需求:
#!/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语句结构中使用的多个模式集。
例如:
aaa
,bbb
或ccc
是脚本的第一个参数,则会输出matched - pattern1
。 hello
或world
是第一个参数,则会输出matched - pattern2
。 didn't match
。答案 2 :(得分:1)
使用eval也有效:
eval 'case "$1" in
'$test')
echo "matched"
;;
*)
echo "did not match"
;;
esac'