in einem Script, bei Pfadangaben hinten Slashes entfernen
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
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
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:Zu verwenden ist die Funktion wie folgt:Eventuell existierende Slashes am Ende werden abgetrennt, andere Zeichenketten (ohne Slashes am Ende) werden unverändert ausgegeben.
Nun gut, man könnte natürlich auchschreiben, aber dann hat man pro Argument, dass man beharken möchte, einen sed-Aufruf. Die erste Lösung ist da eher schneller.
Jochen
... 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: Select all
#!/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
}
Code: Select all
ARG=$(chop_slashes "$1")
Nun gut, man könnte natürlich auch
Code: Select all
VAR=$(echo "$ARG" | sed -e 's-/*$--')
Jochen
Die grösste Lüge der EDV? "Mal eben..."
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
hat die Ausgabe
Ciao, micbur
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: Select all
echo test | cut -c -3
Code: Select all
tes
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
Jochen
Die grösste Lüge der EDV? "Mal eben..."
Dann wollnwer mal...
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.
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).
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.
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.
Wenn nichts mehr verkürzt wurde, wird die Schleife verlassen. Also das Ergebnis ausgeben.
Alles klar soweit oder sind noch Fragen offen?
Jochen
Code: Select all
typeset I
typeset J
Code: Select all
J="$1"
I="${J%/}"
Code: Select all
until [[ "x$I" = "x$J" ]] ; do
Code: Select all
J="$I"
I="${J%/}"
done
Code: Select all
echo $J
Alles klar soweit oder sind noch Fragen offen?
Jochen
Die grösste Lüge der EDV? "Mal eben..."
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.
Aber ansonsten hat mir das und das hier weitergeholfen.
Ciao, micbur
PS:
Aus deinem Script ist jetzt Folgenes geworden:
Oben im Script wird dann noch geprüft, ob es überhaupt ein $1 gibt.
Ciao, micbur
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.
Aber ansonsten hat mir das und das hier weitergeholfen.
Ciao, micbur
PS:
Aus deinem Script ist jetzt Folgenes geworden:
Code: Select all
# 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"
Ciao, micbur
- frank rudolph
- Posts: 146
- Joined: 13. Apr 2004 12:18
- Location: Giessen
- Contact:
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
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