Chcę działać na liście podkatalogów w katalogu. Rozważać:
for x in x86-headers/*/C/populate.sh; do echo $x; done
To daje
x86-headers/elf/C/populate.sh
x86-headers/gl/C/populate.sh
x86-headers/gmp/C/populate.sh
x86-headers/gnome2/C/populate.sh
x86-headers/gtk2/C/populate.sh
x86-headers/jni/C/populate.sh
x86-headers/libc/C/populate.sh
Ale chcę wartości, która odpowiada drugiej części ścieżki
elf
, gl
itp wiem jak rozebrać wiodącym x86-headers
.
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
co daje
elf/C/populate.sh
gl/C/populate.sh
gmp/C/populate.sh
gnome2/C/populate.sh
gtk2/C/populate.sh
jni/C/populate.sh
libc/C/populate.sh
Wiem też, jak zrzucić późniejsze warunki na ścieżce. Tj. Schodzę o jeden poziom:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
daje
elf
gl
gmp
gnome2
gtk2
jni
libc
Ale próba połączenia ich nie działa. To znaczy
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
daje
bash: ${${x##x86-headers}%%/*}: bad substitution
Bez wątpienia jest to niepoprawna składnia, ale nie znam poprawnej składni. Oczywiście mogą być na to lepsze sposoby. Gdybym używał Pythona, użyłbym podziału, /
aby podzielić każdą ścieżkę na listę, a następnie wybrać drugi element, ale nie wiem, jak to zrobić w bash.
EDYCJA: Dzięki za odpowiedzi. Powinienem również zapytać, czy można to zrobić przenośnie, a jeśli tak, to w jaki sposób?
i=${x#*/}; i=${i%%/*}
jest opcjonalny, prawda?