Eu quero atuar em uma lista de subdiretórios em um diretório. Considerar:
for x in x86-headers/*/C/populate.sh; do echo $x; done
Isto dá
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
Mas eu quero valores que corresponde à segunda parte do caminho,
elf
, gl
, etc. Eu sei como retirar o líder x86-headers
.
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
que 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
Eu também sei como retirar termos posteriores no caminho. Ou seja, descendo um nível:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
dá
elf
gl
gmp
gnome2
gtk2
jni
libc
Mas, tentar combinar isso não funciona. Ou seja,
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
dá
bash: ${${x##x86-headers}%%/*}: bad substitution
Sem dúvida, esta é uma sintaxe incorreta, mas não conheço a sintaxe correta. Claro que pode haver melhores maneiras de fazer isso. Se eu estivesse usando Python, usaria split on /
para dividir cada caminho em uma lista e depois escolher o segundo elemento, mas não sei como fazer isso no bash.
EDIT: Obrigado pelas respostas. Eu também deveria ter perguntado, é possível fazer isso de forma portável? Se sim, como?
i=${x#*/}; i=${i%%/*}
é opcional, certo?