Otrzymuję od użytkownika pewną bezwzględną ścieżkę do pliku i chcę utworzyć zmienną, która będzie ciągiem, który nie będzie zawierał tylko PIERWSZYCH dwóch składników ścieżki pliku, ale nie będzie go drukować ani nic.
Na przykład ścieżka bezwzględna może być:
/home/myusername/folder1/folder2/folder3
I jest zapisany w „ścieżka_docelowa”, i chcę, aby „mój_katalog” był tylko:
/folder1/folder2/folder3
Próbowałem użyć polecenia cięcia na różne sposoby, ale bez powodzenia.
command-line
bash
environment-variables
Życie Pi
źródło
źródło
/home/username
rzeczywisty$HOME
katalog wywołującego użytkownika? jeśli tak, możesz to usunąć po prostu za pomocąmydir="${target_path#$HOME}"
, myślęOdpowiedzi:
Korzystanie z manipulacji ciągiem bash :
Tak więc ciąg, który chciałbyś być (dodając początkowy ukośnik):
Dla zmiennej
a
,${a#foo}
usunie najkrótszą dopasowanie ciągfoo
od początku dniaa
. Tak więc usuwamy najkrótszy ciąg zawierający trzy/
(w tym ukośnik na ścieżce), aby usunąć pierwsze dwa elementy ścieżki bezwzględnej.źródło
Oto przykład użycia
cut
Jeśli potrzebujesz prowadzenia,
/
możesz dołączyć| sed 's/^/\//'
go na końcu linii.Potrzebujesz,
-f4-
ponieważ-d '/'
mówi,cut
aby użyć/
jako separatora między polami. Pierwsze pole znajduje się przed pierwszym ogranicznikiem, w tym przypadku pierwsze pole jest puste. Podobniefolder1
jest z czwartym polem i-f4-
mówi cut, aby używać wszystkich pól od czwartego.źródło
Możesz użyć rozszerzenia parametrów bash w następujący sposób:
Po tym:
daje:
Działa poprzez usunięcie pierwszego dopasowania wzorca
/*/*/
ze zmiennej target_path przy użyciu${target_path#pattern}
składni rozszerzenia parametru powłoki. Niestety usuwa to pierwszy/
znak, dlatego znak ten musi zostać jawnie dołączony podczas ustawiania zmiennej myvar.Ostrzeżenie: przed użyciem tej metody należy sprawdzić, czy zmienna target_path zawiera niektóre znaki i jest dłuższa niż dwa segmenty ścieżki. Na przykład jeśli
target_path=/home/username/
, tomyvar=/
. Może to być niebezpieczne dla twojego systemu, jeśli używasz czegoś podobnegorm -rf "$myvar"*
. Nie próbuj tego!źródło