【问题标题】:Mixing regular expression and other conditional expression in a bash if statement在 bash if 语句中混合正则表达式和其他条件表达式
【发布时间】:2011-01-28 00:43:57
【问题描述】:

我已经有一段时间无法解决这个问题了。当我阅读手册和教程时,我越来越困惑。我想要一个具有以下逻辑的 if 语句:

if [ -n $drupal_version ] && [[ "$drupal_version" =~ DRUPAL-[6-9]-[1-9][1-9] ]]; then

但我无法让它正常工作。

当使用“bash -x ...”脚本构造评估脚本时,可以正常工作,但是当作为常规脚本运行时,我的表达式不会被评估(尽管应该满足上述条件,但运行 else 部分) .

您能提供任何帮助吗?

【问题讨论】:

    标签: regex bash if-statement


    【解决方案1】:

    你可以使用case/esac,没有正则表达式。可以在 bash 中使用

    if [ -n "$drupal_version" ] ;then
      case "$drupal_version" in
       DRUPAL-[6-9]-[1-9][1-9]) 
          echo "found"
          ;;
       *) 
          echo "version not correct"
          ;;
      esac
    fi
    

    但是,如果您想要正则表达式,请注意它是 =~ 而不是 =

    [[ $drupal_version =~ DRUPAL-[6-9]-[1-9][1-9] ]] && echo "found"
    

    【讨论】:

    • 案例方法是一种有趣的方法。使用“=”是我的一个错字,在我的代码中我使用“=~”。在同一个 if 语句中混合单括号 [ 和双括号 [[ 是否有问题?
    • 不,没有问题,但是使用]]] 有一些区别。如果您使用单个 ],请引用您的变量。你可以看到serverfault.com/questions/52034/…
    【解决方案2】:

    感谢大家的回复。双括号 ]] 是特定于 bash 的构造,它反过来要求脚本的第一行指向 #!/bin/bash 而不是我的 #!/bin/sh。更改了该行,一切正常。

    【讨论】:

      猜你喜欢
      • 2019-12-11
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 2019-11-28
      • 2011-01-21
      相关资源
      最近更新 更多