如何捕获传递给 Groovy 脚本的参数?

Posted

技术标签:

【中文标题】如何捕获传递给 Groovy 脚本的参数?【英文标题】:How to capture arguments passed to a Groovy script? 【发布时间】:2011-09-16 01:54:26 【问题描述】:

我刚刚开始使用 Groovy。我在任何地方都找不到任何关于如何处理 Groovy 脚本参数的示例,所以我自己破解了这个方法。必须有更好的方法来做到这一点?如果是这样,我正在寻找这种更好的方法,因为我可能忽略了显而易见的事情。

import groovy.lang.Binding;
Binding binding = new Binding();
int x = 1
for (a in this.args) 
  println("arg$x: " + a)
  binding.setProperty("arg$x", a);
  x=x+1

println binding.getProperty("arg1")
println binding.getProperty("arg2")
println binding.getProperty("arg3")

【问题讨论】:

【参考方案1】:

如果您使用--compile-static--type-checked 选项运行脚本,args 变量将不可见,因此编译会引发错误:

[静态类型检查] - 变量 [args] 未声明。

我喜欢在脚本顶部执行以下操作:

import groovy.transform.Field

@Field String[] args = binding.getVariable('args') as String[]

这会将args 公开为一个全局变量,可以在脚本中的任何位置使用。


参考资料:

https://***.com/a/53783178/2089675

https://groovy-lang.org/structure.html#_variables

【讨论】:

【参考方案2】:

如果您想要更高级的解析而不仅仅是获取参数,您可以使用 Groovy CliBuilder 来帮助您。它可以帮助您处理命令行标志、可选参数和打印使用说明。

查看 CliBuilder 的 Javadoc 或 MrHakis post 了解它。

【讨论】:

【参考方案3】:

试试这个:

args.eachprintln it

【讨论】:

【参考方案4】:

最简单的就是将this.args用作数组,例如:

test.groovy

println this.args[0]

呼叫:

C:>groovy test this

输出:

this

【讨论】:

【参考方案5】:

它与 Java 非常相似,您可以使用相同的 java 语法。例如。

class TestExecutor 

    public static void main(def args) 
        println("Printing arguments");
        for(String arguments : args) 
            println (arguments);
        
    

 

运行它,您应该会看到打印的参数

C:\Users\athakur\Desktop>groovy TestExecutor.groovy test1 test2 test3
Aug 16, 2014 11:47:56 AM org.codehaus.groovy.runtime.m12n.MetaInfExtensionModule
 newModule
WARNING: Module [groovy-nio] - Unable to load extension class [org.codehaus.groo
vy.runtime.NioGroovyMethods]
Printing arguments
test1
test2
test3

还请注意,如果您不提供 main 方法或提供类似上述示例的方法,那么您可以将参数设为 args[i],但您可以更改数组的名称(再次与 java 相同)。所以你可以有类似的东西 -

public static void main(def argsNew) 
    println("Printing arguments");
    for(String arguments : argsNew) 
        //using args in above for loop will throw error
        println (arguments);
    

重点是它不是硬编码的。最后,正如其他答案中所建议的,您始终可以使用 CliBuilder 进行智能解析。但同样,它在内部也使用了def options = cli.parse(args)

【讨论】:

"//在上面的 for 循环中使用 args 会抛出错误" - 什么 args ? "如果你不提供 main 方法或者提供一个类似上面例子的方法,那么......但是你可以更改数组的名称" - 不明白。 @BlessedGeek 这意味着如果您不提供 main 方法或在参数中提供一个数组名称为 args 的方法,您可以访问通过 args[i] 传递的参数。但是,如果您将参数中的数组名称从 main(def args) 更改为 main(def argsNew),这是允许的,您将无法再访问以 args[i] 传递的参数,您将不得不使用 argsNew[i],如上面的代码中所述。【参考方案6】:

抱歉问这个问题。我刚刚想通了:

println args[0]
println args[1]
println args[2]

【讨论】:

完美运行。我不知道那件事。这是一个很好的页面,其中列出了所有与 groovy 脚本相关的功能(包括 args 变量)-groovy.codehaus.org/Groovy+CLI @MichalBernhard 这是一份副本:web.archive.org/web/20150317165438/http://groovy.codehaus.org/…

以上是关于如何捕获传递给 Groovy 脚本的参数?的主要内容,如果未能解决你的问题,请参考以下文章

Groovy脚本将值传递给sh。脚本

Jenkins 在 groovy 脚本中检索主动选择参数

如何使用 GroovyShell 传递 JVM 参数和脚本参数?

Groovy 和 Jenkins - 将 curl 输出捕获到文件

在 groovy 脚本之间传递 webdriver 实例?

如何检查传递给 shell 脚本的参数是不是不是整数?