Zum Inhalt springen

Kommando Parameter mit getopts auswerten


mr_kaktus

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...