Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Kommandozeilenoption erzwingen

9 views
Skip to first unread message

Marc Haber

unread,
May 29, 2012, 1:26:21 AM5/29/12
to
Hallo,

ich möchte gerne in eine Kommandozeilenoption erzwingen. Hier mein
Code:

require 'optparse'

options = {}

OptionParser.new do |opts|
opts.banner = "Usage: me [options] file1 file2 ..."

opts.on( '-v', '--verbose', 'Output more information' ) do |v|
options[:verbose] = v
end

options[:outdir] = nil
opts.on( '-o', '--outdir DIR', 'Write output to DIR' ) do |dir|
if dir.nil? or dir.empty? then
puts "--outdir must have an argument"
puts opts
exit
end
puts "dir #{dir}"
options[:outdir] = dir
end

opts.on( '-h', '--help', 'Display this screen' ) do
puts opts
exit
end
end.parse!

if options[:outdir].nil? or options[:outdir].empty? then
puts "--outdir must have an argument"
puts opts
exit
end

Dabei ist gewünscht, dass eine --optdir option auf jeden Fall
angegeben werden muss. Die Fehlerbehandlung innerhalb des
OptionParser.new-Blocks greift nur, wenn --outdir= angegeben ist, also
wirklich --outdir mit ohne Parameter angegeben wurde. Und in der
Fehlerbehandlung außerhalb des Blocks funktioniert das "puts opts"
nicht.

Wie kann ich beides haben, also die Fehlerbehandlung innerhalb des
OptionParser.new-Blocks und eine Fehlermeldung werfen, wenn --outdir
überhaupt nicht angegeben ist?

Grüße
Marc
--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834

Christian Neukirchen

unread,
May 29, 2012, 9:41:46 AM5/29/12
to
Marc Haber <mh+usene...@zugschl.us> writes:

> Wie kann ich beides haben, also die Fehlerbehandlung innerhalb des
> OptionParser.new-Blocks und eine Fehlermeldung werfen, wenn --outdir
> überhaupt nicht angegeben ist?

Dieses Feature hat optparse nicht, das musst du von Hand kontrollieren.
Eine Option ala '--outdir DIR' sollte immer ein erzwungenes Argument
haben (das aber leer sein kann, z.b. "--outdir="). Optionale Argumente
macht man mit '--outdir [DIR]'.

> Grüße
> Marc
--
Christian Neukirchen <chneuk...@gmail.com> http://chneukirchen.org
Message has been deleted

Marc Haber

unread,
May 29, 2012, 2:11:39 PM5/29/12
to
"Oliver Sch@d"
<spam.entfernen.und.bring...@oschad.de> wrote:
>Marc Haber wrote:
>> Wie kann ich beides haben, also die Fehlerbehandlung innerhalb des
>> OptionParser.new-Blocks und eine Fehlermeldung werfen, wenn --outdir
>> überhaupt nicht angegeben ist?
>
>Ich kenne Optparse zu wenig, daher könntest du auch einfach opts nach
>außen schleifen, steht sogar in der Doku.
>
>opts = OptionParser.new do |opts|

Hatte ich überlesen. Dankeschön.

Robert Klemme

unread,
May 29, 2012, 4:39:38 PM5/29/12
to
On 05/29/2012 08:11 PM, Marc Haber wrote:
> "Oliver Sch@d"
> <spam.entfernen.und.bring...@oschad.de> wrote:
>> Marc Haber wrote:
>>> Wie kann ich beides haben, also die Fehlerbehandlung innerhalb des
>>> OptionParser.new-Blocks und eine Fehlermeldung werfen, wenn --outdir
>>> überhaupt nicht angegeben ist?
>>
>> Ich kenne Optparse zu wenig, daher könntest du auch einfach opts nach
>> außen schleifen, steht sogar in der Doku.
>>
>> opts = OptionParser.new do |opts|

Hier ist noch eine andere Variante

require 'optparse'

options = {}

OptionParser.new do |opts|
opts.banner = "Usage: me [options] file1 file2 ..."

opts.on( '-v', '--verbose', 'Output more information' ) do |v|
options[:verbose] = v
end

options[:outdir] = nil
opts.on( '-o', '--outdir DIR', 'Write output to DIR' ) do |dir|
if dir.nil? or dir.empty? then
puts "--outdir must have an argument"
puts opts
exit
end
puts "dir #{dir}"
options[:outdir] = dir
end

opts.on( '-h', '--help', 'Display this screen' ) do
puts opts
exit
end
end.tap do |opts|
opts.parse!

if options[:outdir].nil? or options[:outdir].empty? then
puts "--outdir must have an argument"
puts opts
exit 1
end
end

Ich habe auch noch den "exit" in ein "exit 1" geändert, denn das soll ja
ein Fehler sein.

Ciao

robert

Christian Neukirchen

unread,
May 29, 2012, 5:24:31 PM5/29/12
to
Robert Klemme <short...@googlemail.com> writes:

> if options[:outdir].nil? or options[:outdir].empty? then
> puts "--outdir must have an argument"
> puts opts
> exit 1
> end

> Ich habe auch noch den "exit" in ein "exit 1" geändert, denn das soll
> ja ein Fehler sein.

Ich nehm da gerne Kernel#abort, das druckt auf STDERR und beendet dann
mit != 0.

Robert Klemme

unread,
May 30, 2012, 1:27:50 AM5/30/12
to
On 29.05.2012 23:24, Christian Neukirchen wrote:
> Robert Klemme<short...@googlemail.com> writes:
>
>> if options[:outdir].nil? or options[:outdir].empty? then
>> puts "--outdir must have an argument"
>> puts opts
>> exit 1
>> end
>
>> Ich habe auch noch den "exit" in ein "exit 1" geändert, denn das soll
>> ja ein Fehler sein.
>
> Ich nehm da gerne Kernel#abort, das druckt auf STDERR und beendet dann
> mit != 0.

Ja, ich auch. Aber in diesem Fall soll die Fehlermeldung ja wohl vor
der Ausgabe der Optionen stehen. Von daher bot sich abort nicht an.

Ciao

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Christian Neukirchen

unread,
May 30, 2012, 11:15:40 AM5/30/12
to
Robert Klemme <short...@googlemail.com> writes:

> On 29.05.2012 23:24, Christian Neukirchen wrote:
>> Robert Klemme<short...@googlemail.com> writes:
>>
>>> if options[:outdir].nil? or options[:outdir].empty? then
>>> puts "--outdir must have an argument"
>>> puts opts
>>> exit 1
>>> end
>>
>>> Ich habe auch noch den "exit" in ein "exit 1" geändert, denn das soll
>>> ja ein Fehler sein.
>>
>> Ich nehm da gerne Kernel#abort, das druckt auf STDERR und beendet dann
>> mit != 0.
>
> Ja, ich auch. Aber in diesem Fall soll die Fehlermeldung ja wohl vor
> der Ausgabe der Optionen stehen. Von daher bot sich abort nicht an.

abort "--outdir must have an argument\n#{opts}"

Marc Haber

unread,
Jun 1, 2012, 3:58:14 PM6/1/12
to
Robert Klemme <short...@googlemail.com> wrote:
> end
>end.tap do |opts|

Das kann ich leider nicht verwenden, ich hänge noch bei Ruby 1.8
0 new messages