Usuń znak z końca zmiennej

132

Automatyczne uzupełnianie przez Bash dodaje znak / na końcu nazwy katalogu. Jak mogę usunąć to z parametru pozycyjnego?

#!/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
Spalony
źródło

Odpowiedzi:

244

Posługiwać się

target=${1%/}

Odniesienia .

Martin Clayton
źródło
8
Jest to POSIX , więc jest prawie przenośny.
go2null
3
Zobacz odpowiedź Gillesa, aby case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
dowiedzieć
1
i gdybyś musiał użyć tego ze zmienną, np. DIR, to byłobytarget=${DIR%/}
Brad Parks
Link nie działa (Ukraina)
Зелди
13

Myślę, że lepszym rozwiązaniem do kanonizacji ścieżek jest opcja realpath $pathlub -mopcja, jeśli jej nie ma. To rozwiązanie automatycznie usuwa niepotrzebne ukośniki i dodaje pwd

amenzhinsky
źródło
realpath prawdopodobnie nie będzie bardzo przenośny: unix.stackexchange.com/questions/101080/…
Matthew
realpath jest częścią coreutils GNU, która de facto występuje w dystrybucji Linuksa iw tym przypadku użytkownicy mogli zainstalować różne zewnętrzne pakiety, które mogą zepsuć przenośność
amenzhinsky
2
Nie każda dystrybucja zawiera realpath. Na przykład używam Linux Mint 17 (który jest oparty na Ubuntu) i domyślnie go nie ma. Znajduje się w repozytoriach, ale nie jest instalowany automatycznie. Właśnie o tym omawiałem link, który zamieściłem.
Matthew,
Dobre rozwiązanie dla określonego przypadku użycia, chociaż odpowiedź oznaczona jako poprawna jest najlepsza dla tytułu i najbardziej ogólna. Chciałem usunąć końcowy ukośnik z adresu URL, aby to nie zadziałało. Jeśli chodzi o twoją sugestię tutaj, z doświadczenia odkryłem, że readlink -fjest trochę bardziej przenośny niż realpath. Dodatkowe / alternatywne opcje: linux.die.net/man/1/readlink
flungo
1
To zadziałało dla mnie:target=$(realpath -L --relative-base . $1)
Mattia72
3

Uważaj, bash3 dodał do basha wyrażenie regularne podobne do perl. Wspomniany przewodnik obejmuje to, jak również oficjalny przewodnik GNU , ale nie wszystkie odniesienia tak.

Co ja zrobiłem?

Zastąp 2.19/*być 2.19.

Rozwiązanie

VER="2.19/foo-bar"
NEWVER=${VER%/*}
John P. Fisher
źródło
Nie działa, ukośnik nadal tam jest (na końcu zmiennej, której Twój przykład nie ma).
Zelphir Kaltstahl