[getopts] Keine Leerabfrage von $OPTARG

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Wraith
Beiträge: 40
Registriert: 20.05.2006 20:18:23

[getopts] Keine Leerabfrage von $OPTARG

Beitrag von Wraith » 31.08.2014 21:35:04

Hallo allerseits,

ich brauche mal Hilfe bei Folgendem:

Code: Alles auswählen

#!/bin/bash
[...]
while getopts ":u:" var_cmdopt
do
   case $var_cmdopt in
      u)
         if [ -z $OPTARG ]
            then
               fct_wrgopt "Username missing." 5
            else
               if [ -z `cut -d ':' -f 1 /etc/passwd | grep $OPTARG` ]
                  then
                     fct_wrgopt "User <"$OPTARG"> does NOT exist." 6
                  else
                     fct_setperm $OPTARG
               fi
         fi
         ;;

      *)
         fct_wrgopt "Wrong option." 1
         ;;
   esac
done

Code: Alles auswählen

# ./script.sh -u root
funktioniert ordnungsgemaess.

Code: Alles auswählen

# ./script.sh -u dummy-user
funktioniert auch. Da der User "dummy-user" nicht existiert, wird ordnungsgemaess die Meldung "User <dummy-user> does NOT exist." ausgegeben, aber bei

Code: Alles auswählen

# ./script.sh -u
kommt leider nicht die Meldung "Username missing", sondern die "Wrong option"-Meldung.

Wo habe ich da einen Denkfehler bzw. wieso schlaegt die erste IF-Abfrage (-z $OPTARG) fehl?

PS: Ob ich bei "getopts" den ersten Doppelpunkt setze oder nicht, aendert nichts. Er ist aber notwendig, da "getopts" grundsaetzlich schweigen soll.

Besten Dank im voraus.
- Wraith

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [getopts] Keine Leerabfrage von $OPTARG

Beitrag von Cae » 31.08.2014 22:04:10

Shell-seitig solltest du wohl die Variablen quoten, so wie du es teilweise (unnoetigerweise) mit einigen Argumenten tust. Zu getopt(1) kann ich nix sagen, ich versuche diesen Mist zu meiden, wo es nur geht.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Wraith
Beiträge: 40
Registriert: 20.05.2006 20:18:23

Re: [getopts] Keine Leerabfrage von $OPTARG

Beitrag von Wraith » 31.08.2014 22:08:49

Cae hat geschrieben:Shell-seitig solltest du wohl die Variablen quoten, so wie du es teilweise (unnoetigerweise) mit einigen Argumenten tust. Zu getopt(1) kann ich nix sagen, ich versuche diesen Mist zu meiden, wo es nur geht.

Gruss Cae
Achtung: Ich nutze NICHT getopt(1), sondern getopts (Shell Build In Command).
Davon abgesehen, ob mit oder ohne Quoting funktioniert es nicht. Die Frage ist aber, wenn DU so einen "Mist" meidest, wie dann?

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: [getopts] Keine Leerabfrage von $OPTARG

Beitrag von linuxCowboy » 01.09.2014 00:44:30

zum Beispiel:

Code: Alles auswählen

while getopts ":u:" var_cmdopt; do
	case $var_cmdopt in
		u)
			if [ -z "`cut -d ':' -f 1 /etc/passwd | grep $OPTARG`" ]; then
				fct_wrgopt "User <"$OPTARG"> does NOT exist." 6
			else
				fct_setperm $OPTARG
			fi
			;;
		:)
			fct_wrgopt "Username missing." 5
			;;
		?)
			fct_wrgopt "Wrong option." 1
			;;
	esac
done
-der_linux_cowboy --- Besser werden! ... f*** w$$

Antworten