2014-11-04 103 views
0

寻找if/else语句的帮助。我有2个变量,我想要一个if语句来查看是否可以匹配内部的模式。Bash if-then语句模式

var1="15" 
var2="1|2|3|4|5" 

if [[ $var1 =~ $var2 ]] 
then 
    matches 
else 
    doesn't match 
fi 

这似乎与我尝试时匹配。我有一种感觉,我的语法错了。我想找个15,而不是1或5

+0

这个脚本会清楚地给你一个错误,当您试图运行它。因此,您应该在您的问题中包含错误。 – 2014-11-04 21:20:17

+0

它不会给出错误。它与var2中的1和5匹配,“15”。 – HungryFerret 2014-11-04 21:32:38

+0

你在用什么外壳?那是* exact *脚本吗?因为bash会抛出@choroba正在讨论避免关于赋值行上的管道符号的错误。 – 2014-11-04 21:35:08

回答

1

help [[

当使用`=〜”运算符,字符串操作 右边的匹配为正则表达式。

你的语法很好,如果有点奇怪。我个人会自己使用范围[1-5]

var2="[1-5]" 
+0

其实它不是一个范围。它只是数字,可以是1 | 2 | 5。 – HungryFerret 2014-11-04 21:45:01

+0

好的。但你的'[[''语法还行。 – 2014-11-04 21:48:12

1

以下行不正确:

var2=1|2|3|4|5 

垂直条具有bash中的一种特殊的意义。报价字符串:如果你想整个字符串匹配

var2='1|2|3|4|5' 

,你必须包括^相匹配的开始和$到结束匹配。否则,任何匹配的子字符串都可以满足条件。

if [[ $var =~ ^($var2)$ ]] 
+0

嗯似乎没有区别,仍然匹配。 – HungryFerret 2014-11-04 21:43:44

+0

@HungryFerret:当然可以。 '15'包含'1'或'5'。 – choroba 2014-11-04 22:00:33

0
egrep -q "[1-5]" <<< 15 && echo matches || echo "doesn't match"