【问题标题】:Shell Regex not matching外壳正则表达式不匹配
【发布时间】:2017-10-02 16:47:55
【问题描述】:

我需要从 shell 脚本中的一行提取版本,但我的正则表达式没有获取正确的值。

这是我的脚本:

versionLine="Creating version 1.0.74 ++ grep 'Creating version ' /tmp/apps/runtime/data/jenkins/jobs/myJob/build/68/log"
re=".*Creating version (.*) \+\+.*"

if [[ ${versionLine} =~ $re ]]
then
        echo FOUND: ${BASH_REMATCH[1]}
fi

代码不会进入if。我想回声:FOUND: 1.0.74

【问题讨论】:

  • 奇怪。它对我有用...
  • 顺便说一句,前导和尾随 .* 是隐式的。你不需要它们。
  • 无论如何——你在此处提供的代码工作,如果以 bash 作为 shell 运行。 (如果您使用sh 运行它,则不多)。你能告诉我们它是如何被调用的,发出了什么错误等等吗?
  • 在未来,请确保您提供minimal reproducible example——“可验证”部分的一部分是其他人应该自己看到错误,如果他们复制并粘贴什么你提供了。
  • @thatotherguy,我不同意:这不是 MCVE,因为没有其他人可以真正验证它。如果它实际上在运行时产生了错误,那么它将是一个 MCVE。

标签: regex shell unix


【解决方案1】:

您的脚本使用 bash-only 语法,但没有 shebang。

添加到顶部:

#!/usr/bin/env bash

(或#!/bin/bash,视情况而定)

...并确保您不要使用sh yourscript 调用它。

【讨论】:

  • 谢谢@CharlesDuffy!这就是问题所在!
  • 既然如此,当脚本试图运行时,stderr 就会出现错误。将来,请在您的问题中包含此类错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多