我正在尝试编写一个Bash脚本,它在case语句中使用变量作为模式。然而,我就是不能让它工作。
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
发布于 2012-11-07 00:07:13
您可以使用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
发布于 2012-11-06 23:48:28
(更新的):这里有一些不同的东西,但我希望它能用在你需要的地方:
#!/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
.
发布于 2016-07-02 04:23:07
使用eval也可以:
eval 'case "$1" in
'$test')
echo "matched"
;;
*)
echo "did not match"
;;
esac'
https://stackoverflow.com/questions/13254425
复制相似问题