Mam skrypt, który wymaga katalogu jako jednego argumentu. Chcę wesprzeć dwie formy: jedna jest jak
a/b/c
(bez slash na końcu), a inny jest jak
a/b/c/
(ma slash na końcu).
Moje pytanie: biorąc pod uwagę którąkolwiek z dwóch form, jak mogę po prostu zachować pierwszą formę bez zmian i usunąć ostatni ukośnik z drugiej formy, aby przekonwertować ją na pierwszą formę.
shell-script
filenames
string
Yulong Ao
źródło
źródło
/
.rsync
.Odpowiedzi:
weźmie pierwszy parametr skryptu i usunie ukośnik, jeśli taki istnieje.
źródło
Aby usunąć końcowy ukośnik, jeśli taki istnieje, możesz użyć konstrukcji rozszerzającej parametru usuwania sufiksu obecnej we wszystkich powłokach w stylu POSIX:
Jest kilka komplikacji. Usuwa to tylko jeden ukośnik, więc jeśli zaczniesz od niego
a/b/c//
, nadal będziesz mieć ukośnik. Ponadto, jeśli oryginalna ścieżka była/
, musisz zachować ukośnik. Oto bardziej złożone rozwiązanie, które zajmuje się tymi przypadkami:Alternatywnie, w ksh lub w bash po
shopt -s extglob
:Zauważ, że w wielu przypadkach nie ma znaczenia, że występuje ukośnik końcowy. Nie ma znaczenia, czy argument jest dowiązaniem symbolicznym do katalogu: z ukośnikiem końcowym argument określa katalog, podczas gdy bez ukośnika, argument sam symbolicznie. Ma to również znaczenie w przypadku kilku innych programów, na przykład argument źródłowy
rsync
jest traktowany inaczej w zależności od obecności końcowego ukośnika.źródło
realpath
rozwiązuje podaną ścieżkę. Między innymi usuwa również końcowe ukośniki. Służy-s
do zapobiegania poniższym linkom prostymźródło