代码之家  ›  专栏  ›  技术社区  ›  07_05_GuyT

在groovy的shell中运行循环命令

  •  1
  • 07_05_GuyT  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  2
  •   Szymon Stepniak    6 年前

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

    您可以从不同的角度来处理这个问题:您可以将所有映射条目收集到 make ${arg} 命令,您可以将其传递给 使用换行符联接所有命令后的步骤 \n . 请考虑以下示例:

    def before(Map<String, String> map) {
        sh(map.collect { k,v -> "make ${v}" }.join("\n"))
    }
    
    before([arg1: "foo", arg2: "bar"])
    

    在中执行的代码 步骤相当于以下内容:

    sh """
        make foo
        make bar
    """
    

    更新:在内部执行多个命令 """

    如果要应用前面在内部显示的解决方案 “” 阻止您可以尝试使用如下内容:

    def before(Map<String, String> map) {
        sh """
    
        # Run any command beforehand 
    
        ${map.collect { k,v -> "make ${v}" }.join(" && ")}
        """
    }
    

    这种方法允许您在执行一系列命令之前放置任何bash命令,比如

    make foo && make bar && make 123 
    

    你可以用一个不同于 && (例如 \n 就像前面的例子)。但是,将命令链接到 && 可能更好,因为如果其中一个失败,它将阻止下一个命令运行。

    推荐文章