मैं एक निर्देशिका में उपनिर्देशिकाओं की एक सूची पर कार्य करना चाहता हूं। विचार करें:
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
कोई शक नहीं कि यह गलत सिंटैक्स है, लेकिन मुझे सही सिंटैक्स नहीं पता है। बेशक ऐसा करने के लिए बेहतर तरीके हो सकते हैं। अगर मैं पायथन का उपयोग कर रहा था, तो मैं /
एक सूची में प्रत्येक पथ को तोड़ने के लिए विभाजन का उपयोग करूंगा , और फिर दूसरा तत्व चुनूंगा, लेकिन मुझे नहीं पता कि कैसे इसे bash में किया जाए।
संपादित करें: उत्तर के लिए धन्यवाद। मुझे यह भी पूछना चाहिए था कि क्या ऐसा करना संभव है, और यदि ऐसा है तो कैसे?
i=${x#*/}; i=${i%%/*}
वैकल्पिक है, है ना?