it-swarm.com.de

Was ist der einfachste Weg, um einen abschließenden Schrägstrich von jedem Parameter zu entfernen?

Was ist der einfachste Weg, um einen abschließenden Schrägstrich aus jedem Parameter im Array '$ @' zu entfernen, sodass rsync die Verzeichnisse nach Namen kopiert?

rsync -a --exclude='*~' "[email protected]" "$dir"

Der Titel wurde zur Verdeutlichung geändert. Um die Kommentare und Antworten zu mehreren abschließenden Schrägstrichen zu verstehen, lesen Sie den Bearbeitungsverlauf.

66
sid_com

Du kannst den ... benutzen ${parameter%Word} Erweiterung, die detailliert ist hier . Hier ist ein einfaches Testskript, das das Verhalten demonstriert:

#!/bin/bash

# Call this as:
#   ./test.sh one/ two/ three/ 
#
# Output:
#  one two three

echo ${@%/}
117
Sean Bright

Die akzeptierte Antwort schneidet einen abschließenden Schrägstrich ab.

Eine Möglichkeit, mehrere nachgestellte Schrägstriche zu trimmen, ist wie folgt:

VALUE=/looks/like/a/path///

TRIMMED=$(echo $VALUE | sed 's:/*$::')

echo $VALUE $TRIMMED

Welche Ausgänge:

/looks/like/a/path/// /looks/like/a/path
21
Chris Johnson

Das funktioniert bei mir: ${VAR%%+(/)}

Wie hier beschrieben http://wiki.bash-hackers.org/syntax/pattern

Möglicherweise muss die Shell-Option extglob gesetzt werden. Ich kann nicht sehen, dass es für mich aktiviert ist, aber es funktioniert immer noch

17
Ivan

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

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

In zsh können Sie das :a Modifikator.

export DIRECTORY='/some//path/name//'

echo "${DIRECTORY:a}"

=> /some/path/name

Dies verhält sich wie realpath, scheitert jedoch nicht mit fehlenden Dateien/Verzeichnissen als Argument.

4

Zu Ihrer Information, ich habe diese beiden Funktionen zu meinem .bash_profile Hinzugefügt, basierend auf den Antworten, die auf SO gefunden wurden. Wie Chris Johnson sagte, entfernen alle Antworten mit ${x%/} Nur einen Schrägstrich. Diese Funktionen werden das tun, was sie sagen, ich hoffe, das ist nützlich.

rem_trailing_slash() {
    echo $1 | sed 's/\/*$//g'
}

force_trailing_slash() {
    echo $(rem_trailing_slash $1)/
}
1
Sheljohn