ฉันต้องการดำเนินการกับรายการไดเรกทอรีย่อยในไดเรกทอรี พิจารณา:
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 /
เพื่อแยกแต่ละเส้นทางลงในรายการแล้วเลือกองค์ประกอบที่สอง แต่ฉันไม่รู้วิธีการทำเช่นนั้นในการทุบตี
แก้ไข: ขอบคุณสำหรับคำตอบ ฉันควรถามด้วยเป็นไปได้ไหมที่จะทำสิ่งนี้ได้อย่างสะดวกและถ้าเป็นเช่นนั้นจะเป็นอย่างไร
i=${x#*/}; i=${i%%/*}
เป็นตัวเลือกใช่ไหม