Powiedzmy, że mam kilka zmiennych w skrypcie powłoki (np. W Zsh):
FOLDER_1, FOLDER_2, etc.
Te zmienne odnoszą się do folderów pochodzących z /
. Na przykład, jeśli mam ścieżkę/home/me/stuff/items
zmienne byłyby następujące:
FOLDER_1='home'
FOLDER_2='me'
FOLDER_3='stuff'
Teraz powiedz, że chcę zbudować z powrotem odpowiednią ścieżkę, łącząc zmienne. Jednym z możliwych sposobów jest zbudowanie ścieżki w następujący sposób:
PATH=$FOLDER_1/$FOLDER_2/$FOLDER_3/
Powiedzmy jednak, że niektóre zmienne FOLDER_i
mają ukośniki końcowe, podczas gdy inne nie (i nie wiemy, które) np
FOLDER_1='home'
FOLDER_2='stuff/'
FOLDER_3='items'
Moje pytanie brzmi: jak mogę solidnie zbudować ścieżkę? (np. unikanie podwójnych ukośników i dodawanie ich tam, gdzie powinny być).
Pomyślałem, że jednym ze sposobów jest dodanie /
zawsze między parami zmiennych, a następnie usunięcie wszelkich duplikatów za pomocą sed
, ale nie mogę sprawić, by działało (nie jestem pewien, czy /
poprawnie obsługuję sed
).
A także czy odkrywam koło ? (tj. czy jest już jakieś wbudowane narzędzie, które to robi?).
Na koniec, jeśli zmienne są w tablicy , np. FOLDERS
Czy byłoby to możliwe bez zapętlania? (lub alternatywnie, zapętlając, ale nie wiedząc, ile FOLDERS
ich jest w tablicy).
źródło
%
metoda działa dla pojedynczego ukośnika wymienionego w queston. Aby zaspokoić, gdy występuje wiele ukośników,${parts[@]%%/*}
działa. Oto link do nieco więcej informacji na temat ukośnika: Co oznaczają podwójne ukośniki w ścieżce UNIX? Czy 'cd dir / subdir // valid .../*
w tym przypadku nie oznacza zero lub więcej ukośników , ale ukośnik, po którym następuje dowolna liczba znaków. Oznacza to, że jeśli twoja ścieżka zaczyna się od ukośnika, wynikiem będzie pusty ciąg!extglob
można użyć bash (z wyrażeniem regularnym) ...shopt -s extglob; ${parts[@]%%/+(/)}
...Prosta odpowiedź to przestać się martwić i pokochać wiele cięć. Wiele ukośników ma taki sam efekt jak pojedynczy ukośnik (z wyjątkiem tego, że ścieżka rozpoczynająca się od
//
ma inne znaczenie w kilku systemach; jedyne, jakie mogę wymienić, to warstwy emulacji unixa w systemie Windows). Jest to zgodne z projektem, a możliwość łączenia nazw plików bez obaw o wiele ukośników była główną częścią tej decyzji projektowej.Aby połączyć elementy tablicy, w zsh możesz użyć
j
flagi rozwijania parametrów .Możesz zgnieść duplikaty, gdy jesteś przy nim, ale to czysto kosmetyczne.
W ksh i bash możesz dołączyć do tablicy, używając pierwszego znaku
$IFS
jako separatora. Następnie możesz wycisnąć duplikaty ukośników. W bash musisz zrobić,shopt -s extglob
aby włączyć globs ksh w ostatnim wierszu fragmentu poniżej.źródło
Jak ci
sed
nie działa? Spróbujsed 's|/\+|/|g'
po konkatenacji lubsed 's|/||g'
wcześniej.źródło
bash 4
wprowadzono rozszerzone globowanie, które umożliwia dopasowanie wyrażeń regularnych w podstawianiu parametrów${var....}
... Domyślnie jest wyłączone. Aby włączyć go dla skryptu, wystarczy ustawić opcję powłoki extglob ...Zakładając, że $ dir ==
/home/me/////////stuff//items
Wynikowa wartość $ reż
Oto kilka przykładów z do-i-nie-s - Bash Extended Globbing
źródło