Я хочу діяти у списку підкаталогів у каталозі. Поміркуйте:
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 на, /
щоб перебити кожен шлях у список, а потім вибрати другий елемент, але я не знаю, як це зробити в bash.
EDIT: Дякую за відповіді. Я також повинен запитати, чи можна це робити портативно, і якщо так, то як?
i=${x#*/}; i=${i%%/*}
необов’язково, правда?