2016-04-08 4 views
1

Ich habe versucht, herauszufinden, wie Flaggen ARGV mit machen (ich weiß, über optparser, ich will nicht, es zu benutzen)Fahnen zu machen und defualt läuft, wenn keine ARGV gegeben

Was ich möchte, zu tun ist, eine Flagge zu machen, eine Datei zu laden, und eine Fahne, um die Hilfe zu zeigen, wenn kein Flag gegeben wird ich das Programm ausgeführt werden soll, wie es steht ..

Beispiel say_hi.rb:

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

Stromausgang:

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 

Erwartete Ausgabe:

#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?! 

Wie kann ich dies erreichen zu tun?

+0

Was ist 'say_hi.rb'? – sawa

+0

@sawa Sorry für die Verwirrung, bearbeitet die Frage, um genauer zu sein. – JasonBorne

+0

Ihr Code sieht für mich so aus, als würde es funktionieren. Welches Problem hast du? Übrigens, wenn Sie 'FOO = BAR irb' ausführen, dann können Sie in irb auf' ENV ["FOO"] # => "BAR" 'zugreifen. Wenn Sie Ihr Programm vorzeitig beenden müssen, verwenden Sie einfach 'exit'. –

Antwort

1

Die Datei wird wegen dieser Zeile vorzeitig beendet: $help = usage. Die Methode usage hat den Befehl , wodurch das Skript den Verwendungstext ausgibt und dann beendet wird.

Sobald Sie vorbeikommen, wird die loop { ... } das Programm für immer ausführen, da es eine Endlosschleife ist.

Was ich denke, Sie wollen, ist etwas entlang der Linien von dieser:

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 

Aber wenn Sie den Benutzer erwar der Lage sein, in mehreren args und Fahnen zu analysieren und was nicht, dann können Sie verwenden eine while-Schleife zum parsen der Argumente:

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

Das ist schön, vielen Dank! – JasonBorne

+0

Froh ich könnte helfen :) – br3nt

+0

Wie würde ich die Datei aufrufen, um den Namen darin auszugeben? Könnte ich das mit 'IO.readlines (" # {args} ") machen? – JasonBorne