Я хочу действовать в списке подкаталогов в каталоге. Рассматривать:
for x in x86-headers/*/C/populate.sh; do echo $x; done
Это дает
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
Но я хочу значения, соответствует второй части пути,
elf
, gl
и т.д. Я знаю , как сдирать ведущий x86-headers
.
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
который дает
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
Я также знаю, как избавиться от более поздних сроков в пути. Т.е. спускаясь на один уровень:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
дает
elf
gl
gmp
gnome2
gtk2
jni
libc
Но попытка объединить это не работает. Т.е.
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
дает
bash: ${${x##x86-headers}%%/*}: bad substitution
Без сомнения, это неправильный синтаксис, но я не знаю правильный синтаксис. Конечно, могут быть лучшие способы сделать это. Если бы я использовал Python, я бы использовал split on, /
чтобы разбить каждый путь на список, а затем выбрать второй элемент, но я не знаю, как это сделать в bash.
РЕДАКТИРОВАТЬ: Спасибо за ответы. Я должен был также спросить, возможно ли сделать это переносимо, и если да, то как?
i=${x#*/}; i=${i%%/*}
необязательна, верно?