2017-07-27 39 views
2

我目前正在学习shell脚本并且有一些语法问题。Bash:shell脚本if语句使用多个条件,包括正则表达式

什么,我tyring是使“如果”语句来捕获任何用户输入与字母,除“giveup”行

这里是我建的代码:

if [ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ] 

一旦我运行的代码,它提供了错误信息说:

[: missing `]' 

如果你们有任何解决这个问题,我会很高兴听到你的建议:)

谢谢!

回答

2

test[)任何壳(或外部的)的内置不支持将条件结构例如&&||或多个命令分隔符例如里面有;

另外,[不支持与=~匹配的正则表达式匹配。顺便说一句,你的正则表达式模式不正确,看起来更像是一个全局模式(在这种情况下,这应该就足够了)。

以上两者均由[[关键字bash支持,并非所有shell都支持这些。

所以,你可以这样做:

if [[ $usrGuess = *[[:alpha:]]* && $usrGuess != "giveup" ]] 

在这里,我提出了[[和使用的水珠匹配$usrGuess = *[:alpha:]*(下降正则表达式匹配)。

+0

谢谢你宝贵的答案。我对这个领域完全陌生,你提供了一个很好的解释,我想知道什么。再一次,非常感谢! –

+0

@HojinLee很高兴我可以帮助:) – heemayl

0

使用双括号,为作为条件是复合:

if [[ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ]] 
+0

哇,谢谢你的快速回答!这很尴尬,但我仍然不明白它的工作原理。我发现的是,双括号使得这个过程更快,但我不明白这两者在语法方面的区别。你介意给我解释一下吗? –

+0

'* [:alpha:] *'不是有效的正则表达式。 – chepner

0

使用grep命令稍微不同的方法也可以使用。

if grep -v '^giveup$' <<<$userGuess | grep -iq '^[a-z]*$' 

在这个例子中,我们使用grep命令的退出码来做一个if-else决定。还要注意第二个grep命令的'-q'选项。这可以确保grep命令静默地匹配模式。

优点:如果()子句更简单。

Con:执行了两个grep进程。

+0

谢谢,我从来没有想过这种方法。从字面上看,我昨天开始看这个shell脚本,并且它感觉不到Java附近的任何地方。 :P –

0

如果您确实想保留POSIX兼容性,请使用expr命令执行正则表达式匹配。

if expr "$usrGuess" : '[[:alpha:]]*' > /dev/null && [ "$usrGuess" != "giveup" ] 

无论哪种方式,我会选择首先检查“放弃”如果检查失败,您可以避免使用更昂贵的正则表达式检查。