Bash:shell脚本if语句使用多个条件,包括正则表达式

时间:2017-07-27 08:23:14

标签: regex bash shell if-statement sh

我目前正在研究shell脚本并遇到一些语法问题。

我正在使用的是'if'语句来捕获任何带字母的用户输入,除了“giveup”行

这是我构建的代码:

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

一旦我运行代码,它会发出错误消息,说明:

[: missing `]'

如果你们有任何解决方案,我很乐意听取你的建议:)

谢谢!

4 个答案:

答案 0 :(得分:2)

任何shell(或外部shell)内置的

test[)不支持放置条件构造,例如&&||或多个命令分隔符,例如其中;

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

[[ bash关键字支持上述两种情况,并非所有shell都支持这些。

所以,你可以这样做:

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

在这里,我移动了[[并使用了Glob匹配$usrGuess = *[:alpha:]*(删除了正则表达式匹配)。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

在这个例子中,我们使用grep命令的退出代码来做出if-else决定。另请注意&#39; -q&#39;第二个grep命令的选项。这可确保grep命令以静默方式匹配模式。

优点:不太复杂的if()子句。

Con:执行了两个grep进程。

答案 3 :(得分:0)

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

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

无论哪种方式,我都会先选择反对“放弃”;如果检查失败,则完全避免使用更昂贵的正则表达式检查。