Voglio agire su un elenco di sottodirectory in una directory. Ritenere:
for x in x86-headers/*/C/populate.sh; do echo $x; done
Questo da
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
Ma voglio valori che corrisponde alla seconda parte del percorso,
elf
, gl
, ecc so come spogliano leader x86-headers
.
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
che dà
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
So anche come eliminare i termini successivi nel percorso. Vale a dire scendere di un livello:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
dà
elf
gl
gmp
gnome2
gtk2
jni
libc
Ma, provare a combinare questi non funziona. ie
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
dà
bash: ${${x##x86-headers}%%/*}: bad substitution
Non c'è dubbio che questa è sintassi errata, ma non conosco la sintassi corretta. Naturalmente ci potrebbero essere modi migliori per farlo. Se avessi usato Python, avrei usato split on /
per spezzare ogni percorso in un elenco, e quindi scegliere il secondo elemento, ma non so come farlo in bash.
EDIT: grazie per le risposte. Avrei dovuto anche chiedere, è possibile farlo in modo portabile, e se sì, come?
i=${x#*/}; i=${i%%/*}
è facoltativo, giusto?