PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Flexiblere Abhandlung von Kommandozeilenoptionen - Java



maceop
03-05-2003, 11:45
hi,
also ich hab mich gefragt ob Java es ermöglicht Kommandozeilenoptionen flexibel zu be/verarbeiten.

Bisher habe ich immer so was verwendet :




if(args.length > ...)
{
if(args[0].equals("..."))
;
else if(args[0].equals(" ..... "))

if(args[1].equals("...."))
.....
}




Das ist noch ok für einige wenige kommandozeilenoption, sobald man aber viele hat und diese vielleicht sogar flexibel verwalten können muss, bekommt man probleme.

kennt jemand sowas für java, mit dem man mehr oder weniger flexibel kommandozeilenoptionen abarbeiten kann ?

vielleicht ala getopts...in der SHellprogrammierung....

mfg
maceop

f0rtex
04-05-2003, 15:48
Das hier (http://www.urbanophile.com/arenn/hacking/download.html) hört nach dem an, was du suchst.



GNU getopt - Java port
...
The GNU Java getopt classes support short and long argument parsing in a manner 100% compatible with the version of GNU getopt in glibc 2.0.6 with a mostly compatible programmer's interface as well. Note that this is a port, not a new implementation. ...


greets
f0rtex

p.s: habe es nicht ausprobiert :rolleyes:

maceop
04-05-2003, 16:48
hört sich interessant an, werde es mal ausprobieren.

danke !

mfg
maceop

f0rtex
04-05-2003, 17:14
Post deine Erfahrungen mit dieser Library. Ob sie brauchbar ist oder nicht ;)

MfG
f0rtex

maceop
04-05-2003, 19:31
also erstmal es handelt sich dabei um das Gesuchte.
Der Autor hat es , gemäß Beschreibung, von C auf Java "portiert" und sollte in Java nahezu 100% so funktionieren wie in C.

Es ermöglicht eine deutlich übersichtlichere und flexiblere Abhandlung der Kommandozeilenoptionen !

Weiss einer von euch vielleicht ob (und wenn ja wie) es möglich ist zu einer Option 2 Argumente angeben zu lassen ? Das könnte auch in C gelöst sein, da es ja in Java nicht anders funktioniert.

ich meine z.B.

-f <original_file> <destination_file>

Ansonsten müsste ich eben den Umweg über eine andere Option gehen.....

mfg
maceop

f0rtex
04-05-2003, 20:00
Ich zitiere "Advanced Linux Programming"



In addition, the program is to accept zero or more additional command-line
arguments, which are the names of input files.
To use getopt_long, you must provide two data structures.The first is a character
string containing the valid short options, each a single letter. An option that requires
an argument is followed by a colon. For your program, the string ho:v indicates that
the valid options are -h, -o, and -v, with the second of these options followed by an
argument.
To specify the available long options, you construct an array of struct option ele-
ments. Each element corresponds to one long option and has four fields. In normal
circumstances, the first field is the name of the long option (as a character string, with-
out the two hyphens); the second is 1 if the option takes an argument, or 0 otherwise;
the third is NULL; and the fourth is a character constant specifying the short option
synonym for that long option.The last element of the array should be all zeros.You
could construct the array like this:



const struct option long_options[] = {
{ "help", 0, NULL, `h' },
{ "output", 1, NULL, `o' },
{ "verbose", 0, NULL, `v' },
{ NULL, 0, NULL, 0 }
};


MfG
f0rtex

RapidMax
04-05-2003, 20:15
Dein Beispiel zeigt zwei Parameter mit unterschiedlicher Sematische Bedeutung. Es wäre hier angebracht, dafür zwei Optionen zu verwenden, oder "Optionenlos" zu arbeiten:

Entweder: -i <inputfile> -o <outputfile>
oder -f <inputfile> <outputfile>

beim zweiten gehört das outputfile nicht zur Option -f sondern wird als letzter Parameter erwartet.

Müssen mehrere Werte für eine Option angegeben werden, würde sich eine Komma-getrennte liste Anbieten:

-f file1,file2

Gruss, Andy

f0rtex
04-05-2003, 20:24
@radpidmax
Was gefällt dir an:


const struct option long_options[] = {
{ "file", 2, NULL, `f' }
};


nicht?

greets
f0rtex

maceop
04-05-2003, 22:12
danke für eure antworten.

werds wohl mit zwei optionen machen (bzw. die lösung von fortex mal genauer angucken ;))

mfg
maceop

RapidMax
04-05-2003, 23:07
f0rtex: Klar funktioniert das, allerdings ist es etwas ungewöhnlich. Allerdings kommt beim erwähnten Beispiel dazu, dass die beiden Optionen unterschiedliche Bedeutung haben, hier würde ich immernoch zwei Optionen verwenden.

Gruss, Andy

peschmae
05-05-2003, 12:03
und wenn du ein infile und ein outfile angeben kannst, ist es ja oft üblich, dass man anstelle dessen STDIN bzw STDOUT verwendet, weshalb sich getrennte optionen empfehlen, da man so eines weglassen, d.h. mit STDIN/STDOUT ersetzten kann

MfG Peschmä

RapidMax
05-05-2003, 17:37
Sei dem noch anzufügen, dass stdin auch oft als "-" angegeben werdem muss. Allerdings gefällt mir deine Lösung hier besser ;)

Gruss, Andy

anda_skoa
05-05-2003, 18:21
Man könnte auch per default von stdin lesen und nach stdout schreiben und nur bei entsprechend gesetztem Parameter anders verfahren.

So wie das die meisten Unixtools manchen.

Ciao,
_

peschmae
05-05-2003, 18:54
genau das meinte ich eigentlich :D

aber das ist ja mit der Parameterangabe (oben diskutiert)


-f infile outfile

- also ein flag und dann zwei files - nicht möglich, da ja z. B. das Programm wenn nur eine Datei angegeben wurde, nicht wissen kann, welche denn jetzt gemeint war :p

Nachschauen ob was im STDIN liegt geht ja auch nicht, da das zeugs ja nicht sofort dorthin geschrieben werden müssen soll... (<- schönes Deutsch ;-))

MfG Peschmä

anda_skoa
05-05-2003, 19:02
Ich dachte an sowas in der Art

#> cat input.txt | programm > output.txt

äquivalent zu

#> programm -i input.txt > output.txt

bzw.

#> programm -i input.txt -o output.txt

Ciao,
_

peschmae
06-05-2003, 07:54
ich auch!

MfG Peschmä

maceop
11-05-2003, 16:51
ich benutze nun getopt, doch nun stehe ich vor dem problem das gewisse optionen sich "ausschließen", d.h. wenn z.B. -a ausgewählt wird vom user, darf nicht mehr -b ausgewählt werden (und umgekehrt). Wie kann ich so was machen ?

Es soll also erkennen : aha user wählte -a aus, nun darf kein -b vorkommen oder eben andersrum. eine idee ?

mfg
maceop

f0rtex
11-05-2003, 17:15
wie wäre es mit einer Hilfsvariablen?



int switch=0;

case 'a':
swtich=1;
...
break;
case 'b':
if(switch) {
perror("a und b schliessen sich aus");
exit(EXIT_FAILURE);
} else {
...
}


MfG
f0rtex

maceop
11-05-2003, 19:17
an sowas hatte ich auch schon gedacht, ich dachte eben nur es könnte ja sein das getopt() eine solche funktionalität mitbringt. werds wohl so lösen. danke.

mfg
maceop