Wie entferne ich den letzten Schrägstrich des Verzeichnispfads?

16

Ich habe ein Skript, das ein Verzeichnis als ein Argument erfordert. Ich möchte die zwei Form unterstützen: eine ist wie

a/b/c

(kein Schrägstrich am Ende) und ein anderer ist wie

 a/b/c/

(hat am Ende einen Schrägstrich).

Meine Frage: Wie kann ich bei beiden Formularen das erste Formular unverändert lassen und den letzten Schrägstrich des zweiten Formulars entfernen, um es in das erste Formular zu konvertieren?

Yulong Ao
quelle
2
Nicht, dass dies ein großes Problem sein sollte - ein doppelter Schrägstrich an einer beliebigen Stelle außer am Anfang entspricht einem einzelnen Schrägstrich /.
muru
@muru das wusste ich vorher nicht :).
Yulong Ao
Hier ist eine gute
Frage
1
@muru Ein Schrägstrich am Ende kann einen Unterschied machen, z. B. den Unterschied zwischen der Aktion auf einem Symlink und der Aktion auf dem Verzeichnis, auf das er verweist, oder dem Quellargument von rsync.
Gilles 'SO- hör auf böse zu sein'
@Gilles in der Tat, aber wie Sie sehen können, spreche ich von Verbindungspfaden.
Muru

Antworten:

23
dir=${1%/}

Nimmt den ersten Parameter des Skripts und entfernt einen abschließenden Schrägstrich, falls vorhanden.

Glenn Jackman
quelle
11

Um einen abschließenden Schrägstrich (falls vorhanden) zu entfernen, können Sie das Erweiterungskonstrukt für den Parameter zum Entfernen von Suffixen verwenden, das in allen POSIX-Shells vorhanden ist:

x=${x%/}

Es gibt einige Komplikationen. Dadurch wird nur ein einziger Schrägstrich entfernt. Wenn Sie also mit beginnen, erhalten a/b/c//Sie immer noch einen Schrägstrich. Wenn der ursprüngliche Pfad vorhanden war /, müssen Sie den Schrägstrich beibehalten. Hier ist eine komplexere Lösung, die sich um diese Fälle kümmert:

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

Alternativ in ksh oder in bash nach shopt -s extglob:

[[ x = *[!/] ]] || x=${x%%*(/)}

Beachten Sie, dass es in vielen Fällen keinen abschließenden Schrägstrich gibt. Es spielt keine Rolle, ob das Argument eine symbolische Verknüpfung zu einem Verzeichnis ist: Mit einem abschließenden Schrägstrich kennzeichnet das Argument das Verzeichnis, während das Argument ohne abschließenden Schrägstrich die symbolische Verknüpfung selbst kennzeichnet. Dies ist auch bei einigen anderen Programmen von Bedeutung. Beispielsweise wird das Quellargument von rsyncin Abhängigkeit vom Vorhandensein eines abschließenden Schrägstrichs unterschiedlich behandelt.

Gilles 'SO - hör auf böse zu sein'
quelle
1

realpathLöst den angegebenen Pfad auf. Unter anderem werden auch abschließende Schrägstriche entfernt. Verwenden Sie -sdiese Option, um das Folgen von Simlinks zu verhindern

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
czerny
quelle