• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

rückgabewert von grep oder cut

Hallo,

ich habe versucht eine Funktion in einem Skript zu schreiben,
der die GroupID übergeben wird, und falls sie vorhanden ist, über echo der Gruppename ausgegeben wird.

Falls der Gruppenname vorhanden ist läuft das Skript ohne Fehler.
Nur wenn der Gruppenname feht kommt es zur Fehlermeldung,
unary operator expected.
Aber das Echo Gruppennummer n.v. wird ausgegen,
da der rückgabewert von grep oder cut kein String ist.
Habe es schon mit [ -z $groupnme ] (wahr wenn string leer ist) versucht. Aber das geht auch nicht.

Weiß jemand eine Lösung. Danke schon mal.


function find_grupName ()
{
`grep $1 /etc/group > /tmp/userName`
groupName=`cut -d: -f1 /tmp/userName`

if [ $groupName != "" ] ; then
echo " $groupName ist der Gruppenname"
#`rm -f /tmp/userName`
else
echo "Die Gruppennumer ist nicht vorhanden"
exit 1
fi
}
 
Hallo keule,

zuerst mal folgendes vorausgeschickt: Ich bin alles andere als der Meister der Shell-Programmierung, d.h. ich habe auf diesem Gebiet auch nur Grundkenntnisse.

Zu Deinem Problem bzw. dem von Dir verfolgten Ansatz habe ich folgende Anmerkungen:
  • - So wie Du grep aufrufst, kann es passieren, daß die Ausgabe von grep mehr als eine Zeile umfaßt. Wenn man z.B. nach der Group-ID 100 sucht, dann werden auf meinem System die Gruppen mit den IDs 100 (users) und 1000 (samba) gefunden. Daher empfiehlt es sich aus meiner Sicht, nicht nur nach der Group-ID, sondern auch nach den Doppelpunkten davor und dahinter sowie dem abschließenden Zeilenende ($) zu suchen.
  • - Der Umweg über eine Datei ist eigentlich nicht nötig und bringt eine Reihe zusätzlicher Fehlerquellen (Verzeichnis existiert nicht, keine Schreibrechte für Verzeichnis, Partition ist voll, etc.). Durch die Verwendung des Pipe-Symbols (|) kannst Du die Ausgabe von grep direkt als Eingabe für cut verwenden (siehe Code unten).
  • - Für die Abfrage, ob $groupName leer ist, hattest Du mit if [ -z $groupName ] (bis auf einen Tipfehler) schon den richtigen Ansatz.
Alles in allem würde ich das ganze also wie folgt lösen:

Code:
#!/bin/bash

groupName=`grep ":$1:$" /etc/group | cut -d: -f1`
if [ -z $groupName ] ; then
	echo "Die Gruppennumer ist nicht vorhanden"
else
	 echo "$groupName ist der Gruppenname"
fi
Viele Grüße,
gameboy.
 
Hallo,

danke für die Hilfe. Das mit : hatte ich garnich beachtet.

Für was steht eigentlich das letzte $ bei ":$1:$".



.
 
Hallo keule,

das Dollar-Zeichen steht für das Ende der Zeile. Damit kannst Du sicherstellen, daß nur Übereinstimmungen berücksichtigt werden, auf die dann direkt das Ende der Zeile folgt.

Betrachten wir als Beispiel eine Datei test.txt mit folgendem Inhalt:

Code:
1abcde23
abc123
32abc1
111abc
Suchen wir nun mit grep nach Vorkommen der Eins, dann sieht das so aus:

Code:
~>grep 1 test.txt
1abcde23
abc123
32abc1
111abc
Suchen wir dagegen nur Vorkommen der Eins am Zeilenende, dann erhalten wir:

Code:
~>grep 1$ test.txt
32abc1
Analog könnten wir uns auch nur für das Auftreten einer Eins am Zeilenanfang interessieren, was uns die Verwendung des Symbols "^" ermöglicht:

Code:
~>grep ^1 test.txt
1abcde23
111abc
Weitere Infos über die doch recht umfangreichen Möglichkeiten von regulären Ausdrücken findet man z.B. mit Google bei Eingabe der Stichwörter "regular expressions" oder "regexp" oder natürlich auch mit del.icio.us:, z.B.
- http://del.icio.us/tag/regexp
- http://del.icio.us/popular/regexp

Viele Grüße,
gameboy.
 
Oben