0

非常に単純なスクリプトを作成しましたが、スクリプトに引数を渡したいと思います。

お気に入り:

grails> helloworld -n Howdy
grails> helloworld -name Howdy

スクリプトを使用して:

target(main: 'Hello World') {
    def cli = new CliBuilder()
    cli.with
            {
                h(longOpt: 'help', 'Help - Usage Information')
                n(longOpt: 'name', 'Name to say hello to', args: 1, required: true)
            }
    def opt = cli.parse(args)
    if (!opt) return
    if (opt.h) cli.usage()
    println "Hello ${opt.n}"
}

私は私がするすべての試みで失敗するようです。スクリプトは、-nオプションが存在しないことについて文句を言い続けます。

スクリプトをデバッグすると、argsパラメーターの値が再配置されたように見えます。

でスクリプトを呼び出す場合:

grails> helloworld -n Howdy 

スクリプト内のargsの値は次のとおりです。Howdy-n

私はここで間違ったことで何が欠けていますか?助言がありますか?

4

2 に答える 2

1

問題は、grailsシェルを介してコードを実行していることです。私はあなたのコードをCLI.groovyこのように変換しました:

class CLI{
 public static void main(String [] args){
     def cli = new CliBuilder()
     cli.with
            {
                h(longOpt: 'help', 'Help - Usage Information')
                n(longOpt: 'name', 'Name to say hello to', args: 1, required: true)
             }
      def opt = cli.parse(args)
      if (!opt) return
      if (opt.h) cli.usage()
      println "Hello ${opt.n}"
      }
 }

その後、groovyコマンドを使用して、次のようにLinuxシェルから実行します。

 archer@capitan $ groovy CLI -n Daddy

以下を出力します。

 archer@capitan $ groovy CLI -n Daddy
 Hello Daddy

だからそれは魅力のように機能します。

于 2013-01-12T13:20:11.483 に答える
0

私はグーグル検索をしてsite:github.com grailsScript CliBuilder、出くわしました:

https://github.com/Grails-Plugin-Consortium/grails-cxf/blob/master/scripts/WsdlToJava.groovy

それは私にargs変数がフォーマットされる必要があるというヒントを与えました。残念ながら、次のよう-n Howdyに変化しHowdy\n-nます(順序が再配置された理由、または改行文字が追加された理由がわかりません)。

上記のgithubページには、doSplit()これの一部を処理するメソッドがありますが、再配置された順序を維持します。私が見つけた最良のことは、-nとの間のスペースを削除するHowdyことです。これはCliBuilderで機能します。

以下は私が働いているものです:

target(main: 'Hello World') {
    def cli = new CliBuilder()
    cli.with
            {
                h(longOpt: 'help', 'Help - Usage Information')
                n(longOpt: 'name', 'Name to say hello to', args: 1, required: true)
            }
    def ops = doSplit(args)
    def opt = cli.parse(ops)
    if (!opt) return
    if (opt.h) cli.usage()
    println "Hello ${opt.n}"
}

private doSplit(String string){
    string.split(/(\n|[ ]|=)/).collect{ it.trim() }.findResults  { it && it != '' ? it : null }
}

これを実行します:helloworld -nHowdy

于 2014-10-28T19:43:18.377 に答える