2016-04-08 5 views
1

を与えられなかったとき、私はARGVを使用して旗を作成する方法を理解しようとしてきたdefualtを実行していますは私が望む何を(私がoptparserについて知っている、私はそれを使用したくない)</p> <p>を旗を作り、どれもがARGV

def usage 
    $stderr.puts("Usage: #{File.basename}: [-f|u] <file/path/>") 
    exit 
end 

$file = nil 
$help = usage 

loop { case ARGV[0] 
     when '-f' then ARGV.shift; $file = ARGV.shift 
     when '-h' then ARGV.shift; $help = ARGV.shift 
     else 
      #No flag given, run program with "John" as the method argument 

end } 

def say_hi(name) 
    puts "Hi #{name}! How are you?!" 
end 

say_hi("John") 
..何のフラグが、私はそれが立つように、プログラムを実行する指定されていない場合は、ヘルプを表示するには、ファイル、およびフラグをロードするためのフラグを作成され

例say_hi.rbを行うには

電流出力:

C:\Users\Jason\MyScripts>ruby say_hi.rb 
Usage: say_hi.rb: [-f|u] <file/path/> 

C:\Users\Jason\MyScripts>ruby say_hi.rb -f john.txt 
Usage: say_hi.rb: [-f|u] <file/path/> 

C:\Users\Jason\MyScripts>ruby sayhi.rb -h 
Usage: say_hi.rb: [-f|u] <file/path/> 

john.txt:

John 

予想される出力:

#running without flag => 
ruby say_hi.rb 
#<= Hi John! How are you?! 

#running with -h flag(help) => 
ruby say_hi -h 
#<= Usage: say_hi: [-f|u] <file/path/> 

#running with the -f flag(file) => 
ruby say_hi -f temp/name_file.txt 
#<= Hi John! How are you?! 

私はこれをやって達成することができますどのように?

+0

「say_hi.rb」とは何ですか? – sawa

+0

@sawa混乱して申し訳ありません、より具体的な質問を編集しました。 – JasonBorne

+0

あなたのコードはうまくいくように見えます。あなたはどんな問題を抱えていますか?ところで、 'FOO = BAR irb'を実行すると、irbでは' ENV ["FOO"]#=> "BAR" 'にアクセスできます。プログラムを早期に終了する必要がある場合は、 'exit'を使用してください。 –

答えて

1

ファイルは、この行のために早く終了します:$help = usageusageメソッドにはコマンドexitがあり、これによりスクリプトは使用テキストを出力して終了します。

これを超えると、loop { ... }はプログラムを無限ループとして永久に実行させます。私はあなたがしたいと思う何

は、この線に沿って何かである:

def usage 
    $stderr.puts("Usage: #{File.basename(__FILE__)}: [-f|u] <file/path/>") 
end 

def say_hi(name) 
    puts "Hi #{name}! How are you?!" 
end 

args = ARGV.dup 
arg = args.shift # get the flag 

case arg 
when '-f' 
    file = args.shift 
    puts "doing something with #{file}" 
when '-h' 
    usage 
else 
    say_hi("John") 
end 

しかし、あなたは複数の引数とフラグに解析できるようにするには、ユーザーを期待し、何をしていない場合は、使用することができますargsをパーズするwhileループ:

args = ARGV.dup 
names = [] 

# parse all of the args 
while (flag = args.shift) 
    case flag 
    when '-f' 
    file = args.shift 
    when '-h' 
    # this will cause the program to exit if the help flag is found 
    usage 
    exit 
    else 
    # this isn't a flag, lets add it to the list of things to say hi to 
    names << flag 
    end 
end 

if names.empty? 
    say_hi("John") 
else 
    names.each {|name| say_hi(name) } 
end 
+0

それは美しいです、ありがとう! – JasonBorne

+0

喜んで私は助けることができました:) – br3nt

+0

私はそれの中で名前を出力するためにファイルをどのように呼び出すでしょうか? 'IO.readlines("#{args} ")'でこれを行うことができますか? – JasonBorne

関連する問題

 関連する問題