我目前正在学习shell脚本并且有一些语法问题。Bash:shell脚本if语句使用多个条件,包括正则表达式
什么,我tyring是使“如果”语句来捕获任何用户输入与字母,除“giveup”行
这里是我建的代码:
if [ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ]
一旦我运行的代码,它提供了错误信息说:
[: missing `]'
如果你们有任何解决这个问题,我会很高兴听到你的建议:)
谢谢!
我目前正在学习shell脚本并且有一些语法问题。Bash:shell脚本if语句使用多个条件,包括正则表达式
什么,我tyring是使“如果”语句来捕获任何用户输入与字母,除“giveup”行
这里是我建的代码:
if [ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ]
一旦我运行的代码,它提供了错误信息说:
[: missing `]'
如果你们有任何解决这个问题,我会很高兴听到你的建议:)
谢谢!
test
([
)任何壳(或外部的)的内置不支持将条件结构例如&&
,||
或多个命令分隔符例如里面有;
。
另外,[
不支持与=~
匹配的正则表达式匹配。顺便说一句,你的正则表达式模式不正确,看起来更像是一个全局模式(在这种情况下,这应该就足够了)。
以上两者均由[[
关键字bash
支持,并非所有shell都支持这些。
所以,你可以这样做:
if [[ $usrGuess = *[[:alpha:]]* && $usrGuess != "giveup" ]]
在这里,我提出了[[
和使用的水珠匹配$usrGuess = *[:alpha:]*
(下降正则表达式匹配)。
使用双括号,为作为条件是复合:
if [[ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ]]
哇,谢谢你的快速回答!这很尴尬,但我仍然不明白它的工作原理。我发现的是,双括号使得这个过程更快,但我不明白这两者在语法方面的区别。你介意给我解释一下吗? –
'* [:alpha:] *'不是有效的正则表达式。 – chepner
使用grep
命令稍微不同的方法也可以使用。
if grep -v '^giveup$' <<<$userGuess | grep -iq '^[a-z]*$'
在这个例子中,我们使用grep命令的退出码来做一个if-else决定。还要注意第二个grep命令的'-q'选项。这可以确保grep命令静默地匹配模式。
优点:如果()子句更简单。
Con:执行了两个grep
进程。
谢谢,我从来没有想过这种方法。从字面上看,我昨天开始看这个shell脚本,并且它感觉不到Java附近的任何地方。 :P –
如果您确实想保留POSIX兼容性,请使用expr
命令执行正则表达式匹配。
if expr "$usrGuess" : '[[:alpha:]]*' > /dev/null && [ "$usrGuess" != "giveup" ]
无论哪种方式,我会选择首先检查“放弃”如果检查失败,您可以避免使用更昂贵的正则表达式检查。
谢谢你宝贵的答案。我对这个领域完全陌生,你提供了一个很好的解释,我想知道什么。再一次,非常感谢! –
@HojinLee很高兴我可以帮助:) – heemayl