Entfernen Sie ein Zeichen vom Ende einer Variablen

130

Bei der automatischen Bash-Vervollständigung wird ein / am Ende eines Verzeichnisnamens angehängt. Wie kann ich dies von einem Positionsparameter entfernen?

#!/bin/sh

target=$1

function backup(){
  date=`date "+%y%m%d_%H%M%S"`
  PWD=`pwd`
  path=$PWD/$target
  tar czf /tmp/$date$target.tar.gz $path
}

backup
Brennzeit
quelle

Antworten:

242

Verwenden

target=${1%/}

Eine Referenz .

Martin Clayton
quelle
8
Und es ist POSIX , also ziemlich portabel.
go2null
3
Siehe Gilles Antwort für eine einfache Möglichkeit, mehrere nachfolgende '/' zu case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
entfernen,
1
und wenn Sie dies mit einer Variablen verwenden müssten, z. B. DIR, dann wäre estarget=${DIR%/}
Brad Parks
Ein Link ist tot (Ukraine)
6елди
@ Зелди - danke, behoben.
Martin Clayton
13

Ich denke, eine bessere Lösung zum Kanonisieren von Pfaden ist realpath $pathoder mit -mOption, wenn es nicht existiert. Diese Lösung entfernt automatisch unnötige Schrägstriche und fügt pwd hinzu

Amenzhinsky
quelle
Realpath ist wahrscheinlich nicht sehr portabel: unix.stackexchange.com/questions/101080/…
Matthew
Realpath ist ein Teil von GNU Coreutils, der de facto in der Linux-Distribution enthalten ist. In diesem Fall haben Benutzer möglicherweise verschiedene externe Pakete installiert, die die Portabilität
beeinträchtigen
2
Nicht jede Distribution enthält Realpath. Zum Beispiel verwende ich Linux Mint 17 (das auf Ubuntu basiert) und es hat es standardmäßig nicht. Es befindet sich in den Repos, wird jedoch nicht automatisch installiert. Das war der Link, den ich gepostet habe.
Matthew
Gute Lösung für den angegebenen Anwendungsfall, obwohl die als korrekt gekennzeichnete Antwort die beste für den Titel und die allgemeinste ist. Für mich wollte ich den abschließenden Schrägstrich aus einer URL entfernen, damit dies nicht funktioniert hätte. In Bezug auf Ihren Vorschlag hier habe ich aus Erfahrung herausgefunden, dass dies readlink -fetwas tragbarer ist als realpath. Für zusätzliche / alternative Optionen: linux.die.net/man/1/readlink
flungo
1
Dies funktionierte für mich:target=$(realpath -L --relative-base . $1)
Mattia72
3

Seien Sie vorsichtig, bash3 hat perl-ähnlichen Regex zu bash hinzugefügt. Der erwähnte Leitfaden behandelt dies ebenso wie der offizielle Leitfaden bei GNU , aber nicht alle Referenzen tun dies.

Was habe ich getan?

Ersatz 2.19/*zu sein2.19 .

Lösung

VER="2.19/foo-bar"
NEWVER=${VER%/*}
John P. Fisher
quelle
Funktioniert nicht, Schrägstrich ist noch vorhanden (am Ende der Variablen, die Ihr Beispiel nicht hat).
Zelphir Kaltstahl