Bagaimana cara menangkap argumen yang diteruskan ke skrip Groovy?

Saya baru memulai dengan Groovy. Saya tidak dapat menemukan contoh apa pun tentang cara menangani argumen pada skrip Groovy, jadi saya meretas metode ini sendiri. Pasti ada cara yang lebih baik untuk melakukan ini? Jika demikian, saya mencari cara yang lebih baik, karena saya mungkin mengabaikan yang sudah jelas.

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

person djangofan    schedule 16.06.2011    source sumber


Jawaban (6)


Jika Anda ingin penguraian lebih lanjut daripada sekadar mendapatkan argumen, Anda dapat menggunakan Groovy CliBuilder untuk membantu Anda. Ini membantu Anda dengan tanda baris perintah, argumen opsional, dan mencetak instruksi penggunaan.

Lihat Javadoc atau MrHakis CliBuilder posting tentang hal itu.

person xlson    schedule 17.06.2011

Maaf karena menanyakan pertanyaan itu. Saya baru saja menemukan jawabannya:

println args[0]
println args[1]
println args[2]
person djangofan    schedule 16.06.2011
comment
Bekerja dengan sempurna. Saya tidak tahu tentang itu. Ini adalah halaman bagus yang mencantumkan semua kemampuan terkait skrip asyik (termasuk variabel args) - groovy.codehaus.org/ Asyik+CLI - person Michal Bernhard; 25.09.2014
comment
@MichalBernhard ini salinannya: https://web.archive.org/web/20150317165438/http://groovy.codehaus.org/Groovy+CLI - person pennstatephil; 04.03.2016

Yang paling sederhana adalah dengan menggunakan this.args sebagai array misalnya:

test.groovy

println this.args[0]

Panggilan:

C:>groovy test this

Keluaran:

this
person paulkav1    schedule 01.04.2015

coba ini:

args.each{println it}
person Zak    schedule 08.08.2016

Ini sangat mirip dengan Java dan Anda dapat menggunakan sintaks Java yang sama. Misalnya.

class TestExecutor {

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

} 

Jalankan dan Anda akan melihat argumen tercetak

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

Perhatikan juga jika Anda tidak menyediakan metode utama atau menyediakan metode seperti pada contoh di atas maka Anda bisa mendapatkan argumen sebagai args[i] tetapi Anda dapat mengubah nama array (sekali lagi sama seperti Java). Jadi Anda dapat memiliki sesuatu seperti -

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

Intinya itu bukan sesuatu yang dikodekan secara keras. Akhirnya seperti yang disarankan dalam jawaban lain, Anda selalu dapat menggunakan CliBuilder untuk penguraian cerdas. Tapi sekali lagi itu juga digunakan secara internal def options = cli.parse(args).

person Aniket Thakur    schedule 16.08.2014
comment
//menggunakan args di atas for loop akan menimbulkan kesalahan - argumen apa? - person Blessed Geek; 29.07.2015
comment
jika Anda tidak menyediakan metode utama atau menyediakan metode seperti pada contoh di atas maka... tetapi Anda dapat mengubah nama array - tidak mengerti. - person Blessed Geek; 29.07.2015
comment
@BlessedGeek itu berarti jika Anda tidak menyediakan metode utama atau menyediakan metode dengan nama array dalam argumen sebagai args Anda dapat mengakses argumen yang diteruskan dengan args[i]. Tetapi jika Anda mengubah nama array dalam argumen dari main(def args) menjadi main(def argsNew) yang diperbolehkan, Anda tidak dapat lagi mengakses argumen yang diteruskan sebagai args[i] Anda harus menggunakan argsNew[i] seperti yang disebutkan dalam potongan kode di atas. - person Aniket Thakur; 29.07.2015

Jika Anda menjalankan skrip dengan opsi --compile-static atau --type-checked, variabel args tidak akan terlihat dan oleh karena itu kompilasi akan menimbulkan kesalahan:

[Pemeriksaan tipe statis] - Variabel [args] tidak dideklarasikan.

Saya suka melakukan hal berikut di bagian atas skrip:

import groovy.transform.Field

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

Ini akan mengekspos args sebagai variabel global yang dapat digunakan dimana saja dalam skrip.


Referensi:

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

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

person smac89    schedule 05.09.2020