Bir dizindeki alt dizinler listesinde hareket etmek istiyorum. Düşünmek:
for x in x86-headers/*/C/populate.sh; do echo $x; done
Bu verir
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
Ama yolunun ikinci kısmı ile denktir, yani değerlerini istiyorum
elf
, gl
vb ben lider kapalı şerit biliyorum x86-headers
.
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
hangi verir
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
Ayrıca yolda daha sonraki terimlerin nasıl kaldırılacağını biliyorum. Yani bir seviye aşağı iniyorum:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
verir
elf
gl
gmp
gnome2
gtk2
jni
libc
Ancak, bunları birleştirmeye çalışmak işe yaramaz. yani
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
verir
bash: ${${x##x86-headers}%%/*}: bad substitution
Şüphesiz bu yanlış sözdizimi, ancak doğru sözdizimini bilmiyorum. Elbette bunu yapmanın daha iyi yolları olabilir. Python kullanıyor olsaydım, /
her yolu bir listeye bölmek için bölmeyi kullanırdım ve sonra ikinci öğeyi seçerdim, ama bunu bash'da nasıl yapacağımı bilmiyorum.
EDIT: Cevaplar için teşekkürler. Ayrıca şunu sormalıydım, bunu portatif olarak yapmak mümkün mü ve eğer öyleyse, nasıl?
i=${x#*/}; i=${i%%/*}
isteğe bağlıdır, değil mi?