【问题标题】:Mistake of bash compiler? what is going on [duplicate]bash编译器的错误?发生了什么事[重复]
【发布时间】:2016-08-13 15:25:13
【问题描述】:
#!/bin/bash
i="a001"
if ! [[ $i =~ "a[0-9]{3}"  ]]; then
    echo "success"
fi

输入i="a001" 使其成功,尽管它匹配a[0-9]{3} 模式并且不应执行if 语句。到底是怎么回事?在我看来,这是编译器错误。这是我从昨天开始就没有解决的更大问题的一部分。

【问题讨论】:

  • bash 不是编译器 - 它是解释器
  • 好的,但是我的正则表达式是怎么回事?在 PHP 等其他语言中没有这样的问题
  • 这个if ! 在我看来很像 IF NOT,仅在失败时才回显“成功”?
  • 我试图写 if not 但它没有编译,现在它似乎可以与 Ignacio Vazq 发布的解决方案一起使用......
  • @user3162968,我认为 sln 是在询问您的逻辑是否真实地表达了您的意图,而不是说 ! 是无效或不正确的语法(实际上不是)。 failuresuccess 情况相匹配是不寻常的,因为这意味着您完全了解所有可能的错误情况,这不是典型的情况。

标签: regex bash


【解决方案1】:

为了在 [[ ]] 中具有 =~ 运算符的所有 bash 版本的行为一致,请将您的正则表达式放入一个变量中,并使用该运算符右侧未加引号的变量:

i="a001"
re="a[0-9]{3}"
if ! [[ $i =~ $re ]]; then
    echo "success"
fi

【讨论】:

    【解决方案2】:

    引号转义正则表达式中的元字符,因此不应包含在此处。

    $ i="a001"
    $ [[ $i =~ "a[0-9]{3}"  ]] ; echo $?
    1
    $ [[ $i =~ a[0-9]{3}  ]] ; echo $?
    0
    

    【讨论】:

    • 我认为这是正确的,但由于其措辞方式有点误导。 “不需要引号”意味着引号是多余的,这意味着可以引用,只要您不介意一些额外的输入。正如您的代码所示,这是不正确的,引号是错误的。您的回答还没有真正解释原因。
    • 哇,我想看看他们如何解析围绕参数的分隔符,特别是因为正则表达式是如此元特征化。
    • 它似乎有效,谢谢,我从昨天开始就无法解决这个问题
    • 案例:我正在寻找与“"a001"”匹配的模式,而我使用的正则表达式是"a[0-9]{3}"
    • 空格怎么样。我想匹配 ` ` 我在 ` 中放什么?我如何匹配 ]] ?还有多少与解析用于分隔符概念的冲突?
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多