【问题标题】:Bash: shell script if statement using multiple conditions including regexBash:使用多个条件(包括正则表达式)的 shell 脚本 if 语句
【发布时间】:2018-01-02 20:27:01
【问题描述】:

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

我想要做的就是用 'if' 语句来捕捉任何带有字母表的用户输入,除了“giveup”行

这是我构建的代码:

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

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

[: missing `]'

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

谢谢!

【问题讨论】:

    标签: regex bash shell if-statement sh


    【解决方案1】:

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

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

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

    所以,你可以这样做:

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

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

    【讨论】:

    • 感谢您的宝贵回答。我对这个领域完全陌生,你为我的疑惑提供了很好的解释。再次,非常感谢!
    • @HojinLee 很高兴我能帮上忙 :)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      Con:执行了两个grep 进程。

      【讨论】:

      • 谢谢,我从来没有想过这种方法。从字面上看,我昨天开始看这个 shell 脚本,感觉它与 Java 相去甚远。 :P
      【解决方案4】:

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

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

      【讨论】:

      • 哇,感谢您的快速回答!这很尴尬,但我仍然不明白它是如何工作的。我发现双括号使过程更快,但我不明白这两者在语法方面有什么区别。你介意给我解释一下吗?
      • *[:alpha:]* 不是有效的正则表达式。
      猜你喜欢
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多