Hallo, nachdem der Michael Matz (vielen Dank!) mein letztes Problem so hervorragend gelöst hat, habe ich noch ein Problem/Frage: Wie kann man in der Bash am besten Kommandozeilenparameter (z.B. ./bla -v -t -a) mit einer variablen Anzahl und Reihenfolge parsen? Ich habe mir ein Skript gebastelt, welches auch gut funktioniert, aber ich weiß nicht, wie ich die Anzahl der Parameter flexibel gestalte, so daß auch deren Reihenfolge unterschiedlich sein kann (z.B. ./bla -t -v -a, ./bla -v -a -t -d oder ./bla -version). Momentan benutze ich u.a. folgenden Code: for Parameter in $@; do case $Parameter in -h|--h|-H|--H|\-[hH][eE][lL][pP]|\--[hH][eE][lL][pP]) display_help ;; -t|--t|-T|--T) mach was... ;; ...etc... Wie kann ich nun die Liste der Parameter durchlaufen und in Abhängigkeit von verschiedenen Parameter Aktionen durchführen? Eine While-Schleife? Lassen sich damit auch Parameter kombinieren bzw. Parameter definieren, die nicht zusammen auftauchen dürfen? Vielen Dank und schöne Grüße, Werner.
On Wed, 26 Feb 2003 at 17:31 (+0100), Werner Schalk wrote:
nachdem der Michael Matz (vielen Dank!) mein letztes Problem so hervorragend gelöst hat, habe ich noch ein Problem/Frage: Wie kann man in der Bash am besten Kommandozeilenparameter (z.B. ./bla -v -t -a) mit einer variablen Anzahl und Reihenfolge parsen? Ich habe mir ein Skript gebastelt, welches auch gut funktioniert, aber ich weiß nicht, wie ich die Anzahl der Parameter flexibel gestalte, so daß auch deren Reihenfolge unterschiedlich sein kann (z.B. ./bla -t -v -a, ./bla -v -a -t -d oder ./bla -version). Momentan benutze ich u.a. folgenden Code:
man bash und dort nach getopts suchen. Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Q: How does a Unix guru have sex? A: unzip;strip;touch;finger;mount;fsck;more;yes;umount;sleep
Hi, On Wed, 26 Feb 2003, Werner Schalk wrote:
(z.B. ./bla -v -t -a) mit einer variablen Anzahl und Reihenfolge parsen? Ich habe mir ein Skript gebastelt, welches auch gut funktioniert, aber ich weiß nicht, wie ich die Anzahl der Parameter flexibel gestalte, so daß auch deren Reihenfolge unterschiedlich sein kann (z.B. ./bla -t -v -a, ./bla -v -a -t -d oder ./bla -version). Momentan benutze ich u.a. folgenden Code:
for Parameter in $@; do
case $Parameter in
Dieser Code laesst doch unterschiedliche Reihenfolge schon zu. Ob ich './bla -a -b' oder './bla -b -a' mache, beide Codeteile in dem "case" werden dann ausgefuehrt (natuerlich in umgedrehter Reihenfolge). Wenn du das nicht willst, musst du nicht sofort Dinge tun, sobald du den Parameter erkannt hast, sondern nur merken, dass er da war. Nemen wir mal an, '-a' und '-b' tun Dinge, die man auch gleichzeitig machen kann, aber wenn man beides will, muss man A vor B machen. Dann so: seen_a= seen_b= for arg in $@; do case $arg in -a) seen_a=yes ;; -b) seen_b=yes ;; esac done test -n "$seen_a" && { tue was fuer -a } test -n "$seen_b" && { tue was fuer -b } Dies laesst "-a -b" und "-b -a" (und natuerlich -a und -b alleine) zu, und tut beides mal dasselbe in der gleichen Reihenfolge. So, und wenn du das alles nicht zu Fuss programmieren moechtest, dann hoere auf die anderen im Thread, und benutze getopt (bash(1) oder 'help getopt' im Prompt). Ciao, Micha.
Hallo, On Wed, 26 Feb 2003, Werner Schalk wrote: [..] man 1 getopt ==== ARGS=`getopt --name=$(basename $0) -o hvt: --long help,version,test -- "$@"` if [ $? != 0 ] ; then usage; echo -e "\nTerminating..." >&2 ; exit 1 ; fi eval set -- "$ARGS" while true; do case "$1" in -h|--help) usage; exit 0;; -v|--version) version; exit 0;; -t|-test) test_arg="$2"; shift 2;; --) shift; break;; *) usage; exit 1;; esac done echo "Remaining args:" for a; do echo "$a" done ==== --
Wenn Du KDE 1 an ein vier- und KDE 2 an ein dreibeiniges Schwein bindest und beide gleichzeitig trittst, läuft KDE 1 schneller. F'up. Wenn du beide Schweine gleichzeitig trittst, landest du auf dem Hintern, und dann bleiben beide Schweine vor Lachen stehn ;-) [Robin S. Socha und André Schneider in dcoulm]
Am Mit, 2003-02-26 um 17.31 schrieb Werner Schalk:
Hallo,
nachdem der Michael Matz (vielen Dank!) mein letztes Problem so hervorragend gelöst hat, habe ich noch ein Problem/Frage: Wie kann man in der Bash am besten Kommandozeilenparameter (z.B. ./bla -v -t -a) mit einer variablen Anzahl und Reihenfolge parsen?
Michael hat das Grundprinzip schon erklärt. Der klassische, bash und getopts-freie Weg wäre, den ArgVektor beim Parsen zu zerstören und mit $# und shift zu arbeiten. t_seen=0 while test $# -gt 0; do case $1 in -t ) t_seen=1 shift; .. esac done if $t_seen; then tu_was if Ralf
participants (6)
-
Bernhard Walle
-
David Haller
-
Juergen Schaak
-
Michael Matz
-
Ralf Corsepius
-
Werner Schalk