Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
in einem Script, bei Pfadangaben hinten Slashes entfernen

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Sonstiges
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
micbur



Anmeldungsdatum: 05.06.2004
Beiträge: 86

BeitragVerfasst am: 22. Dez 2005 9:39   Titel: in einem Script, bei Pfadangaben hinten Slashes entfernen

Hallo,

ich habe mir ein Script geschrieben, in dem ein rsync-Aufruf ist. Es gibt auch einen Parameter für das Script. Nun reichen meine Fähigkeiten nicht aus und so recht weiß ich auch nicht, wonach ich eigentlich suche. Ich möchte beim Parameter hinten die Slashes entfernen. Der Parameter stellt einen Teil eines Pfades dar und die Slashes stören dabei.

Aufgerufen wird mein Shell-Script, von einem PHP-Script. Im Normalfall sollten dort schon eventuelle Backslasches durch Slashes ersetzt und die hinteren Slashes entfernt sein. Man kann ja aber auch mein Shell-Script auch von der Kommandozeile aufrufen und daher brauche ich da einfach noch eine Prüfung.

Kann mir da jemand zumindest sagen, was ich eigentlich suche?
Oder geht das gar nicht, was ich will?


Danke & Ciao, micbur
 
Benutzer-Profile anzeigen Private Nachricht senden

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 22. Dez 2005 10:15   Titel:

Slashes am Ende eines Arguments entfernen ist einfach.

... war mein erster Ansatz für dieses Posting. Ich bin immer noch der Meinung, dass es doch eine einfachere Lösung geben müsste, aber die einzige, auf die ich gerade komme, ist diese hier:
Code:
#!/bin/bash

function chop_slashes {
        typeset I
        typeset J

        J="$1"
        I="${J%/}"
        until [[ "x$I" = "x$J" ]] ; do
                J="$I"
                I="${J%/}"
        done
        echo $J
}
Zu verwenden ist die Funktion wie folgt:
Code:
ARG=$(chop_slashes "$1")
Eventuell existierende Slashes am Ende werden abgetrennt, andere Zeichenketten (ohne Slashes am Ende) werden unverändert ausgegeben.

Nun gut, man könnte natürlich auch
Code:
VAR=$(echo "$ARG" | sed -e 's-/*$--')
schreiben, aber dann hat man pro Argument, dass man beharken möchte, einen sed-Aufruf. Die erste Lösung ist da eher schneller.

Jochen
_________________
Die grösste Lüge der EDV? "Mal eben..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

micbur



Anmeldungsdatum: 05.06.2004
Beiträge: 86

BeitragVerfasst am: 22. Dez 2005 11:11   Titel:

Hallo,

danke für den guten Hinweis.
Ich habe im Internet ein Beispiel gefunden, wo es auch um das Abschneiden von Strings geht. Ich experimentiere dadurch gerade mit einer Kombination aus echo und cut herum.

Beispiel
Code:
echo test | cut -c -3

hat die Ausgabe
Code:
tes


Ciao, micbur
 
Benutzer-Profile anzeigen Private Nachricht senden

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 22. Dez 2005 11:54   Titel:

Ja, aber dann musst Du erst mal die Länge des Strings feststellen. Und was passiert, wenn mal mehr als nur ein / zuviel am Pfad hängt? Da Du dann mehrfach externe Programme aufrufen musst, kannst Du dann auch direkt die sed-Lösung verwenden - ein Prozess pro Pfad und Ende. Oder aber nur bash-Hilfsmittel verwenden und die erste Lösung ohne Aufruf externer Programme verwenden.

Jochen
_________________
Die grösste Lüge der EDV? "Mal eben..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

micbur



Anmeldungsdatum: 05.06.2004
Beiträge: 86

BeitragVerfasst am: 23. Dez 2005 11:29   Titel:

OKOK, hmmm, also ich habe nun auch mal komplett deine Lösung ausprobiert. Nur leider kann ich nicht sehen wie sie funktioniert. Ich versuche dahinterzusteigen.

Aber schonmal vielen Dank und ein frohes Fest, micbur
 
Benutzer-Profile anzeigen Private Nachricht senden

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 23. Dez 2005 22:20   Titel:

Dann wollnwer mal... Smile
Code:
typeset I
typeset J
definiert die Variablen I und J als funktionslokal, damit keine Nebeneffekte auftreten, wenn Du auch in deinem Skript irgendwo I und J als Variablennamen verwenden solltest.

Code:
J="$1"
I="${J%/}"
J wird initialisiert mit dem ersten Argument der Funktion (also dem Pfad, der zu kürrzen ist). I wird als Inhalt von J initialisiert, aber wenn am Ende des Inhalt von J ein "/" steht, wird es entfernt. Siehe "man bash", Abschnitt "Parameter Expansion". Vor dem % steht der Variablenname, nach dem % das Pattern, das aus der Zeichenkette anm Ende gelöscht werden soll ("/" eben).

Code:
until [[ "x$I" = "x$J" ]] ; do
Diese Schleife läuft solange, bis I ind J gleich sind. Das ist dann der Fall, wenn an der Inhalt von J gar nicht auf "/" endet und bei der Zuweisung an I auch kein Zeichen entfernt wird. Der Schleifenkörper wird also nur ausgeführt, wenn bislang ein "/" entfernt werden konnte.

Code:
    J="$I"
    I="${J%/}"
done
J wird der um ein Zeichen verkürzte Pfad zugewiesen, I wieder der Inhalt von J weniger einem eventuellen Slash am Ende. Dann ist der Schleifenkörper zu Ende und am Schleifenkopf wird wieder geprüft, ob die zwei Variablen jetzt gleich sind.

Code:
echo $J
Wenn nichts mehr verkürzt wurde, wird die Schleife verlassen. Also das Ergebnis ausgeben.

Alles klar soweit oder sind noch Fragen offen?

Jochen
_________________
Die grösste Lüge der EDV? "Mal eben..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

micbur



Anmeldungsdatum: 05.06.2004
Beiträge: 86

BeitragVerfasst am: 27. Dez 2005 10:28   Titel:

Danke, danke, danke.

Alles klar. Habe das Script auch schon angepasst. Mir ist dann auch gleich aufgefallen, dass die Bash keine Scopes/Namespaces kennt. Daran muss man sich erstmal wieder gewöhnen, wenn man lange OO programmiert hat. Wink

Aber ansonsten hat mir das und das hier weitergeholfen.

Ciao, micbur



PS:
Aus deinem Script ist jetzt Folgenes geworden:
Code:
# hier wird ein Verzeichnisname zurechtgestutzt.
# Nehmen wir an, eine Eingabe war mangelhaft, indem zu viele Slashes am Ende des Pfades
#  angegeben wurden. Fuer rsync sind diese Slashes zu viel fatal. Man synchronisiert dann
#  falsche Verzeichnisse miteinander. Meist so, dass das zu synchronisierene Verzeichnis
#  auf dem Zielsystem noch einmal in sich hinein synchronisiert wird.
#     Beispiel: host1:/path/to/sync              <- Quellensystem
#               host2:/path/to/sync/sync         <- Zielsystem
    dirname="$1"                          # sichern des Parameters
    parentdir="${1%/}"                    # parentdir ist der Parameter ohne dem letzten Slash (so es ihn gibt)
                                          # hier wird so geparst: modifikation="${original%pattern}
                                          #    dabei wird das Original um das Pattern gestutzt
                                          #    ist das Pattern nicht vorhanden, ist die Modifikation identisch mit dem Original
    until [[ "x$parentdir" = "x$dirname" ]] ; do
      # in dieser Schleife wird so lange der letzte Slash gestutzt, bis keiner mehr vorhanden ist
      dirname="$parentdir"
      parentdir="${dirname%/}"
    done
    # hier haben wir in den Variablen 'dirname' und 'parentdir' denselben Pfad ohne die letzten Slashes
    parentdir="${parentdir%/*}"           # fuer das Parentdir wird nochmal von hinten alles bis zum nächten Slash abgeschnitten
                                          # Pattern ist hier '/*'

#    echo "Verzeichnisname   : $dirname"
#    echo "Parentverzeichnis : $parentdir"

Oben im Script wird dann noch geprüft, ob es überhaupt ein $1 gibt.


Ciao, micbur
 
Benutzer-Profile anzeigen Private Nachricht senden

frank rudolph



Anmeldungsdatum: 13.04.2004
Beiträge: 146
Wohnort: Giessen

BeitragVerfasst am: 31. Dez 2005 13:49   Titel: schön

Hallo
Es ist doch immer wieder schön kleine Scripte zu lesen die von Jochen kommentiert sind.

Ich habe zwar im Moment nicht genau das Problem mit den Slashes aber ich schaue mit immer mit Begeisterung die Skripte an und wenn sie dann auch noch so schön kommentiert und erklärt sind dann kann man (ich) eine Menge lernen.

Vielen Dank!!!! und einen guten rutsch ins neue Jahr
mfg
Frank
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Sonstiges Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy