Wie werden Argumente erfasst, die an ein Groovy-Skript übergeben wurden?


73

Ich fange gerade mit Groovy an. Ich konnte nirgendwo Beispiele finden, wie man mit Argumenten für ein Groovy-Skript umgeht, und habe diese Methode selbst gehackt. Es muss einen besseren Weg geben, dies zu tun? Wenn ja, suche ich diesen besseren Weg, da ich wahrscheinlich das Offensichtliche übersehen habe.

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")

Antworten:


36

Wenn Sie eine erweiterte Analyse wünschen, als nur die Argumente abzurufen, können Sie den Groovy CliBuilder verwenden, um Ihnen zu helfen. Es hilft Ihnen bei Befehlszeilenflags, optionalen Argumenten und beim Drucken der Verwendungsanweisung.

Kasse CliBuilder 's Javadoc oder MrHakis Post darüber.


106

Tut mir leid, dass ich die Frage gestellt habe. Ich habe es gerade herausgefunden:

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

Funktioniert perfekt. Das wusste ich nicht. Hier ist eine gute Seite, auf der alle Funktionen für groovige Skripte aufgelistet sind (einschließlich der Variablen args) - groovy.codehaus.org/Groovy+CLI
Michal Bernhard

1
@MichalBernhard Der Link ist nicht mehr gültig.
The Unknown Dev

@ Jamil thx für Feedback. Ich habe versucht, einen neuen Speicherort zu finden, aber ohne Erfolg: / Und es scheint, dass die Seite nicht einmal über den Google-Cache verfügbar ist.
Michal Bernhard


20

Am einfachsten ist es, nur this.argsein Array zu verwenden, z.

test.groovy

println this.args[0]

Anruf:

C:>groovy test this

Ausgabe:

this

Schön und einfach
Vadim

8

Versuche dies:

args.each{println it}

2

Es ist Java sehr ähnlich und Sie können dieselbe Java-Syntax verwenden. Zum Beispiel.

class TestExecutor {

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

} 

Führen Sie es aus und Sie sollten die Argumente gedruckt sehen

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

Beachten Sie auch, dass Sie Argumente erhalten können, wenn Sie keine Hauptmethode oder eine wie im obigen Beispiel angeben, args[i]aber Sie können den Namen des Arrays ändern (wieder dasselbe wie Java). Sie können also so etwas wie -

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

Punkt ist, dass es nicht etwas ist, das fest codiert ist. Schließlich können Sie, wie in einer anderen Antwort vorgeschlagen, CliBuilder immer für die intelligente Analyse verwenden. Aber auch hier wird es intern verwendet def options = cli.parse(args).


"// Wenn Sie die obigen Argumente für die Schleife verwenden, wird ein Fehler ausgegeben" - welche Argumente?
Seliger Geek

"Wenn Sie keine Hauptmethode oder eine wie im obigen Beispiel angeben, dann ... aber Sie können den Namen des Arrays ändern" - verstehen Sie nicht.
Seliger Geek

@BlessedGeek bedeutet, dass Sie argsauf die mit args [i] übergebenen Argumente zugreifen können, wenn Sie keine Hauptmethode oder eine Methode mit einem Arraynamen in Argumenten angeben . Aber wenn Sie den Array - Namen von in Argumenten ändern main(def args)zu main(def argsNew)denen darf man keinen Zugriff mehr Argumente übergeben , wie args[i]Sie zu verwenden haben argsNew[i]wie im Code oben erwähnt snipped.
Aniket Thakur

0

Wenn Sie Ihr Skript mit --compile-staticoder --type-checkedoption ausführen , wird die argsVariable nicht angezeigt und die Kompilierung gibt daher einen Fehler aus:

[Statische Typprüfung] - Die Variable [args] ist nicht deklariert.

Ich mache oben im Skript gerne Folgendes:

import groovy.transform.Field

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

Dies wird argsals globale Variable verfügbar gemacht, die an einer beliebigen Stelle im Skript verwendet werden kann.


Verweise:

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.