getopts - ordentliche Parameternamen?

2TAKTER

2TAKTER

Foren As
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...
 
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
 
Zuletzt bearbeitet:
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?
 
Zuletzt bearbeitet:
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....
 
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....

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:
 
Zuletzt bearbeitet:

Ähnliche Themen

NagiosGrapher 1.7.1 funktioniert nicht

Last mit etc/passwd anzeigen lassen

dovecot und postfix Konfiguration Problem

'xml Parser' in bash

Fehlende Argumente bei getopts

Zurück
Oben