Problem mit getopts



  • Hallo,

    ich sitze momentan an einem shell-script (bash), welches mit mehreren Optionen aufgerufen werden kann, hier mal der getopts-Auszug:

    while getopts :dfhkmpvzs: OPT; 
    do
    	case $OPT in
    
    	d) OPT_D=1;;
    	f) OPT_F=1;;
    	h) OPT_H=1;;
    	k) OPT_K=1;;
    	m) OPT_M=1;;
    	p) OPT_P=1;;	
    	s) OPT_S=1; SUCHE_S=$OPTARG;;
    	v) OPT_V=1;;
    	z) OPT_Z=1;;
    	\?) echo "$PROG: Nicht erlaubte Option -- $OPTARG" >&2
    		syntax;;
    	:) echo "$PROG: Die Option $OPTARG erfordert ein Argument" >&2
    		syntax;;
    	esac
    done
    

    Die Option -s erfordert dabei einen Suchbegriff. Also ein Aufruf wäre:
    ala -s Suchbegriff file.log

    Die Option -s darf aber auch mit anderen Optionen aufgerufen werden, dabei soll folgende Syntax möglich sein:
    ala -shk Suchbegriff file.log

    Wenn ich allerdings so die Optionen schreibe, werden die Buchstaben hk als Suchbegriff verwendet.

    ala -s Suchbegriff -hk file.log
    funktioniert z.b.

    Vorgabe des Dozenten ist aber, dass der Aufruf auch wie oben geschrieben möglich ist. Hat da jemand einen Vorschlag ?

    Und dann noch dieses Problem:

    SUCHE_D='*Directory index forbidden by rule:*'
    
    #LOGDAT enthält Datei welche durchsucht werden soll
    grep $SUCHE_D $LOGDAT   #funktioniert nicht, da der string nicht korrekt an grep gegeben wird
    
    grep "Directory index forbidden by rule" $LOGDAT   #dies funktioniert dagegen
    

    Wie kann ich also den kompletten Variablenwert (bestehend aus durch Leerzeichen getrennte Wörter) komplett an grep übergeben ?

    Gruss,
    Lalas



  • lalas schrieb:

    Die Option -s darf aber auch mit anderen Optionen aufgerufen werden, dabei soll folgende Syntax möglich sein:
    ala -shk Suchbegriff file.log

    Das kann so mit getopt eigentlich nicht funktionieren, und wäre auch mehr als unüblich. Entweder, der Suchbegriff ist das Argument von -s, dann muß er aber auch direkt nach dem -s stehen. Oder aber der Suchbegriff steht, genauso wie der Dateiname, erst am Ende des Befehls, und zwar unabhängig von irgendwelchen Optionen.

    Was noch halbwegs sinnvoll wäre ist allerdings, daß man diese 2 Varianten erlaubt:
    ala -s Suchbegriff -hk file.log
    ala -hk Suchbegriff file.log
    D.h. der Suchbegriff kann entweder mit der Option -s oder als unabhängiges Argument übergeben werden, aber in letzterem Fall darf dann eben auch kein -s da stehen.

    lalas schrieb:

    grep $SUCHE_D $LOGDAT   #funktioniert nicht, da der string nicht korrekt an grep gegeben wird
    

    Du kannst die Variablen nochmal in Anführungsstriche setzen:

    grep "$SUCHE_D" $LOGDAT
    


  • Hi,

    das mit grep funktioniert trotzdem nicht, habe nun alle Schreibvarianten durch:

    grep "$SUCHE_D" $LOGDAT
    grep '$SUCHE_D' $LOGDAT
    grep $SUCHE_D $LOGDAT
    

    Bei den Varianten in Anrührungsstriche bzw Hochkomma, kommt keine Fehlermeldung mehr. Wenn cih die Ausgabe in eine Datei umlenke, bleibt diese leer.

    Ich verzeifel langsam, auch mit awk funktioniert es nicht...



  • lalas schrieb:

    Bei den Varianten in Anrührungsstriche bzw Hochkomma, kommt keine Fehlermeldung mehr. Wenn cih die Ausgabe in eine Datei umlenke, bleibt diese leer.

    Dann ist dein regulärer Ausdruck falsch... Was möchtest du mit den Sternchen bewirken? Wenn die Sternchen wortwörtlich in der Datei stehen sollen, bräuchtest du " \* ". Wenn du sagen willst "beliebige Zeichen, beliebig oft", dann wäre das " .* ".
    Aber grep guckt zunächst einmal sowieso nur, ob der Suchstring in einer Zeile vorkommt, egal was davor oder danach steht. Von daher könntest du die Sternchen wahrscheinlich auch ganz einfach weglassen.



  • Hach wie geil, wenn ich die * im string weglasse funktioniert es. Allerdings wurde die strings vom Dozenten GENAU so vorgegeben. Egal, ich änder das entsprechend.

    Dann noch eine ganz doofe Frage:

    Der filename des script lautet einfach nur "ala"

    In der Uni kann ich es in der shell aufrufen, indem ich einfach "ala -d logfile.log" tippe

    Hier am PC zuhause muss ich immer "./ala -d logfile.log" tippen. Was bewirk das ./ und wie bekomme ich es hin, dass mein script sich hier ebenfalls einfach per Dateiname starten lässt ?
    Denke mal das hat was mit den PATH-Einstellungen zu tun, da das script bei der Uni in einem anderen directory ausgeführt wird.

    Gruss,
    Lalas



  • da siehst du richtig mit dem PATH.
    wenn der folder wo dein script/binary liegt im PATH gesetzt ist kannst du es immer ausführen, bzw deine shell schaut halt in PATH nach.

    kannst ja mal "echo PATH" eingeben dann siehst du dein setting. PATH ändern z.b. mit "export PATH=/pfad1:/pfad2:PATH"

    mit ./file bezeichnest du immer das file in der lokalen directory.


Anmelden zum Antworten