在Groovy的Shell中运行循环命令

时间:2018-12-04 12:25:20

标签: bash shell jenkins groovy

我使用以下命令,该命令按预期工作

def before(Map<String, String> params) {
  sh """

  make ${params.get('arg')}
  """
}

现在我需要对其进行一些修改以使用循环运行,并且出现并发症错误

def before(Map<String, String> params) {
  sh """

  params.each{ k, v -> make ${v} }
  """
}

任何想法如何解决?我尝试添加{ }失败

1 个答案:

答案 0 :(得分:2)

您会看到一个编译错误,因为传递给sh步骤的字符串的正文包含bash无法识别的部分(此部分:params.each{ k, v -> make ${v} })。

您可以从不同的角度解决此问题:您可以将所有映射条目收集到make ${arg}命令列表中,并在使用换行符{加入所有命令后将其传递到sh步骤{1}}。考虑以下示例:

\n

def before(Map<String, String> map) { sh(map.collect { k,v -> "make ${v}" }.join("\n")) } before([arg1: "foo", arg2: "bar"]) 步骤中执行的代码等效于以下内容:

sh

更新:在sh """ make foo make bar """ 块中执行多个命令

如果您想应用前面在"""块中显示的解决方案,则可以尝试使用以下方法:

"""

这种方法将允许您在执行一系列命令之类的命令之前放置任何bash命令

def before(Map<String, String> map) {
    sh """

    # Run any command beforehand 

    ${map.collect { k,v -> "make ${v}" }.join(" && ")}
    """
}

您可以使用与make foo && make bar && make 123 不同的连接符(例如,像上一个示例中的&&)。但是,用\n链接命令可能会更好,因为如果其中一个失败,则会阻止下一个命令运行。