Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Kommando Parameter mit getopts auswerten

Empfohlene Antworten

Veröffentlicht

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

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.

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

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.

Danke für dein Beispiel, das ist ein Interessanter ansatz, den ich austesten werde :D

Was würdest du für eine Spache vorschlagen ? Perl oder wie ?

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

Du meinst, man könnte das Theoretisch einfach weg lassen ?

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.