getopts - ordentliche Parameternamen?

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von 2TAKTER, 03.03.2008.

  1. #1 2TAKTER, 03.03.2008
    2TAKTER

    2TAKTER Foren As

    Dabei seit:
    26.11.2007
    Beiträge:
    94
    Zustimmungen:
    0
    Ort:
    Würzburg (zugezogen)
    Hi, ich schreibe derzeit ein paar shell-skripte und würde gern ordentliche Parameternamen vergeben wie z.b.

    Code:
    Befehl -name hans
    Code:
    while getopts ":name:" optname
    do
    	case $optname in
    		name)
    			echo "Name: $OPTARG"
    			;;
    		:)
    			echo "No argument value for option $OPTARG"
    			;;
    		*)
    			# Should not occur
    			echo "Unknown error while processing options"
    			;;
    	esac
    done
    funktioniert nicht...
    wie ist überhaupt diese syntax zu verstehen mit den ganzen doppelpunkten im kopf der schleife? kann ich auch parameter setzen, die keinen wert verlangen? ich rall diese getopts geschichte einfach nicht...
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 aspire_5652, 03.03.2008
    Zuletzt bearbeitet: 03.03.2008
    aspire_5652

    aspire_5652 Tripel-As

    Dabei seit:
    02.01.2008
    Beiträge:
    198
    Zustimmungen:
    0
    getopts geht nur mit kurzen Optionen. Mit den Doppelpunkten bedeutet, dass noch ein Argument erwartet wird. Wenn ein Schalter ohne Argument erwartet wird und nur dazu gedacht ist, irgendwas zu aktivieren, dann lässt du den Doppelpunkt weg. Hier ein Bsp:


    ./script -a "foo" -b "bar" -c
    Code:
    while getopts 'a:b:c' OPTION ; do
    case $OPTION in
    	a)	VALUE_A=$OPTARG;;
    	b)	VALUE_B=$OPTARG;;
    	c)	OPTION_C=true;;
    	
    	\?)	echo "Unbekannte Option \"-$OPTARG\"."
    		echo $HELP ; exit 1;;
    	:)	echo "Option \"-$OPTARG\" benötigt ein Argument."
    		echo $HELP ; exit 1;;
    	*)	echo "Dies kann eigentlich nicht passiert sein ...\"$OPTION\"... ";;
    esac
    done
     
  4. #3 Gott_in_schwarz, 03.03.2008
    Zuletzt bearbeitet: 03.03.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    getopt kann auch lange optionen. allerdings funktioniert das nicht ganz so intuitiv wie getopts. laut manpage sind unter /usr/share/doc/util-linux/examples beispiele für die benutzung, wobei ich das bash beispiel mal so umgeformt habe, wie ich damit arbeiten würde:
    Code:
    #!/bin/bash
    
    optarr=( $(getopt -o 'ab:c::' --long 'a-long,b-long:,c-long::' -- "$@") )
    
    i=0
    while true; do
        case ${optarr[$i]} in
            -a|--a-long) echo "Option a" ; ((i++));;
            -b|--b-long) echo "Option b, argument ${optarr[$((i+1))]}";((i=i+2));;
            -c|--c-long)
                        # c has an optional argument. As we are in quoted mode,
                        # an empty parameter will be generated if its optional
                        # argument is not found.
                        case "${optarr[$((i+1))]}" in
                                "''") echo "Option c, no argument"; ((i=i+2));;
                                *)  echo "Option c, argument is ${optarr[$((i+1))]}"; ((i=i+2));;
                        esac;;
            --) ((i++)); break;;
            *) echo "Internal Error!"; exit 1;;
            esac
    done
    
    restargs=( ${optarr[@]:i} )
    wobei das mit dem optionalen c-argument nur klappt, wenn zwischen dem c-schalter und dem optionsargument kein leerzeichen ist, also:
    Code:
    ./opts.bash -cdies_ist_das_c_argument
    das geht natürlich deshalb, weil die option nur ein buchstabe lang ist, mit der langen c option krieg ich das gar nicht gebacken. das original beispiel (/usr/share/doc/util-linux/examples/getopt-parse.bash) funktioniert genausowenig. hat jemand ne idee warum das so ist?
     
  5. #4 2TAKTER, 04.03.2008
    2TAKTER

    2TAKTER Foren As

    Dabei seit:
    26.11.2007
    Beiträge:
    94
    Zustimmungen:
    0
    Ort:
    Würzburg (zugezogen)
    Code:
    #! /bin/bash
    # zeug halt
    
    HELP_AUTODRP="autodpr [-options] [params]\n\t --bw black and white print \n\t --col color print \n\t --ps Postscript print"
    
    BW_PRINT=0
    COL_PRINT=0
    POSTSCRIPT_PRINT=0
    SLEEPTIME=5
    PRINTCOUNT=1
    PRINTPORT=6001
    
    TEMP=`getopt -o 'hP:s:' -l 'help,bw,col' -n 'AUTODPR' -- "$@"`
    
    if [ $? != 0 ] ; then echo "No param given... Terminating..." >&2 ; exit 1 ; fi
    
    # Note the quotes around `$TEMP': they are essential!
    eval set -- "$TEMP"
    
    while true ; do
            case "$1" in
    		-h|--help)
    			echo -e $HELP_AUTODRP ;
    			shift ;
    			break ;;
    		--bw)
    			BW_PRINT=1 ;
    			shift ;;
    		--col)
    			COL_PRINT=1 ;
    			shift ;;
    		--ps)
    			POSTSCRIPT_PRINT=1 ;
    			shift ;;
    		-P)
    			PRINTPORT=${2} ;
    			shift ;;
    		-s)
    			SLEEPTIME=${2};
    			shift ;;
                    --)
    			shift ;
    			break ;;
                    *)
    			echo "Internal error!" ;
    			exit 1 ;;
            esac
    done
    
    exit 0
    das funktioniert soweit... schalter parameter wie --bw oder --col nimmt er an... nur parameter wie -P oder -s brechen ab... kA warum... dabei sind beide mit Doppelpunkten gesetzt....
     
  6. #5 Gott_in_schwarz, 04.03.2008
    Zuletzt bearbeitet: 04.03.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    weil du nur um eine stelle shiftest an der stelle:
    Code:
    -P)
    			PRINTPORT=${2} ;
    			shift ;;
    nach dem shift ist $1 das argument, welches du der -P option übergeben hast. du hast ja quasi zwei "slots": einmal die option und einmal deren argument, deswegen musst du um 2 shiften. mach also bei "-P" und bei "-s" aus dem "shift" einfach ein "shift 2".

    edit: außerdem mach mal das leerzeichen aus der shebang. wie sieht das denn aus o:
     
Thema:

getopts - ordentliche Parameternamen?

Die Seite wird geladen...

getopts - ordentliche Parameternamen? - Ähnliche Themen

  1. Fehlende Argumente bei getopts

    Fehlende Argumente bei getopts: Hi, ich mmuss beim Programmaufruf mehrere Parameter angeben. Mit getops überprüfe ich die Argumente, die zwingend sind. Wenn ich ein Argument...
  2. Coverity-Report 2013 bescheinigt Linux-Kernel außerordentliche Qualität

    Coverity-Report 2013 bescheinigt Linux-Kernel außerordentliche Qualität: Die alljährlich vom US-Unternehmen Coverity durchgeführte Untersuchung zur Code-Qualität von freier im Vergleich zu proprietärer Software liegt...
  3. Ordentliches Netzwerk für zu Hause mit Notebook

    Ordentliches Netzwerk für zu Hause mit Notebook: Hi zusammen, ich suche eine optimale Lösung, wie ich mein Netzwerk zu Hause einrichten kann. Das Hauptproblem ist eigentlich mein Notebook,...