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


73

我只是从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")

Answers:


36

如果您想要的不仅仅是解析参数,还可以使用Groovy CliBuilder来帮助您。它可以帮助您使用命令行标志,可选参数和打印用法说明。

签出CliBuilder的Javadoc或MrHakis发布有关它的信息。


106

很抱歉问这个问题。我只是想通了:

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

完美运作。我不知道 这是一个不错的页面,其中列出了所有与groovy脚本相关的功能(包括args变量)-groovy.codehaus.org/Groovy+CLI
Michal Bernhard

1
@MichalBernhard链接不再有效。
未知开发人员

@Jamil thx以获取反馈。我试图找出新的位置,但没有成功:/看来该页面甚至无法通过Google缓存访问。
米哈尔·伯恩哈德


20

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

测试规则

println this.args[0]

呼叫:

C:>groovy test this

输出:

this

漂亮又简单
Vadim


2

它与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方法或不提供上述示例中的方法,则可以获取参数as,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?
Blessed Geek

“如果您不提供主要方法或不提供上述示例中的方法,那么...但是您可以更改数组的名称”-不明白。
Blessed Geek 2015年

@BlessedGeek意味着如果您不提供main方法或在参数中提供带有数组名称的方法,则args可以访问args [i]传递的参数。但是,如果你在参数更改从数组名main(def args)main(def argsNew)这是允许你再也不能访问参数传递的args[i],你将不得不使用argsNew[i]在代码中提到上述剪断。
Aniket Thakur

0

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

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

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

import groovy.transform.Field

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

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


参考文献:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.