PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pattern Matching im Shellscript



Technaton
02-01-2005, 00:33
Hallo,

ich komme irgendwie nie recht mit Shellskripts zurande... Jedenfalls quäle ich mich immer ziemlich damit. ;)

Im Moment möchte/muß ich mir eine Art Funktionsbibliothek für Startskripte basteln, ähnlich der functions library von RedHat. In einer Funktion muß ich die übergebenen Werte prüfen, ob davon welche Parameter sind, und wo dann der eigentliche Pfad zum Programm beginnt. Das wollte ich mit Regexp lösen, oder Pattern Matching, und brauche etwas, das auf /^--\w=.+?$/ passen würde (also GNU-Getopts-Stil: --param=wert). Ehrlich gesagt aber habe ich keinerlei Ahnung, wie ich das anstellen kann, denn das Bash-Manual hilft mir nicht wirklich, genauso wie der Scripting-Guide von TLDP. :( Jemande eine Idee, wie ich das doch noch gebogen bekommen könnte?

Gruß,
Tech

peschmae
02-01-2005, 09:43
Das kann die GNU Bash erst seit Version 3.0.



dd. `configure' has a new `--enable-cond-regexp' option (enabled by default)
to enable the =~ operator and regexp matching in [[ ... ]].

ee. Subexpressions matched by the =~ operator are placed in the new
BASH_REMATCH array variable.
http://cnswww.cns.cwru.edu/~chet/bash/NEWS

Allerdings solltest du dir auch überlegen ob du wirklich Bash 3.0 voraussetzen willst oder nicht lieber etwas anderes (Perl? Awk?) nimmst.

MfG Peschmä

Technaton
02-01-2005, 13:02
Perl kommt nicht in Frage, da es im Bootskripte geht, und ich nicht voraussetzen kann, daß Perl installiert und aufrufbar ist. Wie kann ich Regexp-Matching mit awk/grep machen? Bisherige Versuche schlugen leider fehl, zumal grep bspw mir immer 0 zurückgab, statt 1 (oder etwas anderem), wenn der Vergleich negativ ausfiel.

peschmae
02-01-2005, 15:47
Was geht genau nicht bei grep? Bei mir funktioniert das "grep -q" wies soll - 0 wenn die Regexp passt, 1 wenn nicht.

MfG PEschmä

Technaton
02-01-2005, 22:11
Also, die Funktion bekommt bspw ein "--nice=12". Ich mache: `echo $1 >grep -q /^--\w=*?$/` und will $? abfragen, aber grep gibt aus:
grep: unrecognized option `--nice'
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
Das Muster funktioniert; wenn ich grep mit `grep <Muster> -` starte, und dann verschiedene Möglichkeiten durchprobiere, werden nur die Treffer nochmal angezeigt. Ich weiß leider nicht, wie ich aus einem Script raus grep dazu benutze

peschmae
03-01-2005, 10:42
Hab ich das richtig verstanden: Die Funktion soll nur prüfen ob das Ding "Parameterform" - d.h. "--xyz=asdf" hat?

Dann versuch mal sowas:


echo "--nice=12" | grep -q -e "^--[A-Z][a-z]*\=.*$"; echo $?


Oder möchtest du jeweils noch den zugehörigen Wert (also das nach dem = ) extrahieren?
Dann folgt nachher noch ein

WERT=$(echo "--nice=12" | sed s/.*=//)

MfG Peschmä

Technaton
03-01-2005, 15:55
Mit 'nem Pipe! ARGH. Ok, kein Wunder, daß grep sich querstellt und $? immer 0 hatte - echo war ja in jedem Fall erfolgreich bei echo $1>grep ...

Dankeschön! :)

Gibt's eigentlich eine Möglichkeit, das gleich ins if reinzubasteln, also, das folgende zu komprimieren:


echo $1|grep -qE <Muster> -
if [ $? == 0 ]; then
... blablubb ...
fi

peschmae
03-01-2005, 16:29
if echo $1|grep -qE <Muster> - ; then
... blablubb ...
fi

Geht auch ganz direkt denn:
Der Rückgabewert von "echo $1|grep -qE <Muster>" ist der Rückgabewert von grep - d.h. wenn du Kommandos mit Pipes verknüpfst gilt der letzte Rückgabewert.
if checkt auf Rückgabewerte von nem Programm - [ ] ist nur ein Synonym für das Programm "test" - wenn der 0 ist wird das Zeugs nachher ausgeführt.

MfG Peschmä

Technaton
03-01-2005, 18:20
Dankeschön, so sieht das fein aus. :)