Saya ingin bertindak pada daftar subdirektori dalam direktori. Mempertimbangkan:
for x in x86-headers/*/C/populate.sh; do echo $x; done
Ini memberi
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
Tapi aku ingin nilai-nilai yang bersesuaian dengan bagian kedua dari jalan,
elf
, gl
, dll saya tahu bagaimana menanggalkan terkemuka x86-headers
.
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
pemberian yang mana
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
Saya juga tahu cara menghapus istilah nanti di jalan. Yaitu turun satu tingkat:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
memberi
elf
gl
gmp
gnome2
gtk2
jni
libc
Tetapi, mencoba menggabungkan ini tidak berhasil. Yaitu
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
memberi
bash: ${${x##x86-headers}%%/*}: bad substitution
Tidak diragukan lagi ini adalah sintaks yang salah, tetapi saya tidak tahu sintaks yang benar. Tentu saja mungkin ada cara yang lebih baik untuk melakukan ini. Jika saya menggunakan Python, saya akan menggunakan split /
untuk memecah setiap jalur menjadi daftar, dan kemudian memilih elemen kedua, tapi saya tidak tahu bagaimana melakukannya di bash.
EDIT: Terima kasih atas jawabannya. Saya seharusnya juga bertanya, apakah mungkin melakukan ini dengan mudah, dan jika demikian, bagaimana?
i=${x#*/}; i=${i%%/*}
adalah opsional, bukan?