mr_kaktus Geschrieben 22. Februar 2006 Geschrieben 22. Februar 2006 Hi @all, ich schreib gerade ein Skript, der mit 2 Paramerter aufgerufen werden darf aber mindest einen haben muss. Das Eigentliche skript ist fertig, nun möchte ich jetzt eine Auswertung der Parameter vornehmen. Das wollte ich mit getopts lösen, aber ich bekomme das nicht gebacken, villeicht kann mir jemand Helfen ? Das ist das Auswertunsskript: # Es muss mindestesns ein Argument übergeben werden # -------------------------------------------------- if (( $# <= 0 )) ; then usage $EXIT_ERROR fi #set -x # Eläuterung der Schalter: # -h ==> Hilfe # -u ==> Username # -g ==> Primary group while getopts ':u:g:h' OPTION do case $OPTION in u) USERNAME=$2 ;; g) GROUP="${4:-users}" ;; h) usage $EXIT_SUCCESS ;; \?) echo "Unbekannte Option \"-$OPTARG\"." >&2 usage $EXIT_ERROR ;; echo "Option \"-$OPTARG\" benötigt ein Argument." >&2 usage $EXIT_ERROR ;; *) echo "Dies kann eigentlich gar nicht passiert sein..." >&2 usage $EXIT_BUG ;; esac done echo "\$OPTION ==> $OPTION" echo "\$USERNAME ==> $USERNAME" echo "\$GROUP ==> $GROUP" # Verbrauchte Argumente überspringen shift $(( OPTIND - 1 ))[/code] Mein Problem liegt nun darin, ich möchte alle möglichen Eingabe bzw. Parameterfehler abfangen. Beim ausführen des Skripts mit absichtlich falschen eingaben passiert da gar nichts:[code]./mkhome.sh a $OPTION ==> ? $USERNAME ==> $GROUP ==> Die variable $OPTION wird mit einem Wert gefühlt ==> "?", Jetzt sollte die Case-Anweitung springen, tut sie aber nicht. Was mache ich falsch? by mr_kaktus Zitieren
DevilDawn Geschrieben 23. Februar 2006 Geschrieben 23. Februar 2006 Parameter die nicht mit "-" eingeleitet werden werden von getopts ignoriert. Daher springt dein Script nicht mal in die Schleife - getotps ist sofort false, setzt aber OPTION trotzdem auf "?". Folglich wird dein case nie durchlaufen. Auch getopts rettet dich nicht davor, danach noch einige Abfragen zu machen PS: Wäre immer gut die Scriptsprache im Topic zu nennen. Hier wohl explizit bash. Zitieren
mr_kaktus Geschrieben 24. Februar 2006 Autor Geschrieben 24. Februar 2006 Hi, hm... hast mir ein Tip, wie ich das Prob lösen könnte ? Ja tut mir leid, du hast recht hier handelt es sich um die bash. gruß mr_kaktus Zitieren
DevilDawn Geschrieben 24. Februar 2006 Geschrieben 24. Februar 2006 Nun, die legalen Optionen werden gehandled. Die illegalen Optionen ("-*") werden erkannt und angemahnt. Fehlt also nur der Check ob zuviele nicht-Optionen angegeben wurden. Das könnte man tun indem man sicherstellt das alle gegebenen Parameter von getopts abgefrühstückt wurden. Da $OPTIND dann auf (Anzahl Parameter)+1 stehen müsste kann man das Abfragen. #!/bin/bash # # Usage: bar [vVxq] -u USER BARVERSION="0.0.1beta-3RC1" VERBOSE=0 XENOPHOBIA=0 QUIET=0 while getopts ':vVxqu:' OPTION do case $OPTION in v) # Verbose VERBOSE=1 ;; V) # show Version echo "this is bar v${BARVERSION}" exit 0 ;; x) # be xenophobe XENOPHOBIA=1 ;; q) # be quiet QUIET=1 ;; u) # Username USERNAME=$OPTARG ;; \?) echo "Unbekannte Option \"-$OPTARG\"." >&2 exit 1 ;; echo "Option \"-$OPTARG\" benötigt ein Argument." >&2 exit 1 ;; esac done # check REQUIRED options # [...] TODO # check: unhandled params? let NUMPARAM=$#+1 if [ $NUMPARAM -ne $OPTIND ] then echo "Unbekanter Parameter an Position $OPTIND" >&2 # exit 1 fi # [...] exit 0 [/code] Generell ist die bash für sowas aber eigentlich nicht geschaffen. Zitieren
mr_kaktus Geschrieben 24. Februar 2006 Autor Geschrieben 24. Februar 2006 Danke für dein Beispiel, das ist ein Interessanter ansatz, den ich austesten werde Was würdest du für eine Spache vorschlagen ? Perl oder wie ? Zitieren
DevilDawn Geschrieben 24. Februar 2006 Geschrieben 24. Februar 2006 Perl bietet sich natürlich an, da du kaum eine Unix-Kiste ohne Perl finden wirst. Gehört praktisch überall zur Basisinstallation Ausserdem hat Perl eine sehr angenehme Getoptions-Funktion. Aber es ist immer die Frage ob sich Perl lohnt. Genauso wie die Frage ob sich die Überprüfung der extra Parameter lohnt - man kann sie auch einfach ignorieren. Wie immer: "Depends!" Zitieren
mr_kaktus Geschrieben 24. Februar 2006 Autor Geschrieben 24. Februar 2006 Du meinst, man könnte das Theoretisch einfach weg lassen ? Zitieren
DevilDawn Geschrieben 24. Februar 2006 Geschrieben 24. Februar 2006 Ich meine man sollte den Aufwand gegen den Nutzen abschätzen - nicht mehr, nicht weniger. Wenn ich ein Manntag brauche ein Script so zu schreiben das es nur 100% korrekte Angaben annimmt, das Script später aber eh nur von 2 Admins genutzt wird die Plan haben (sollten) was sie tun ist das leicht Overkill. Schreibe ich ein Script für einen Kunden der wenig Erfahrung mit Unix Shell hat dann ist es sicherlich Sinnvoll die Zeit zu investieren - wenn ein falscher Umgang mit dem Script verheerende Auswirkung haben kann. Wenn man so ein getopts-Framework natürlich eh schon hat kann man es ohne viel Aufwand aber immer wieder Einsetzen. Das schadet dann nichts. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.