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

Odpowiedzi:




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


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%/*}

Nie działa, ukośnik nadal tam jest (na końcu zmiennej, której Twój przykład nie ma).
Zelphir Kaltstahl
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.