मेरे पास 100 उपनिर्देशिकाएँ हैं और मैं उनमें से पहले दस के माध्यम से लूप के लिए बैश में लूप करना चाहता था जैसे:

for d in ./output/*[0..9];
do 
    echo $d
done

लेकिन आउटपुट मुझे अपेक्षित नहीं लगता है:

./output/405050
./output/405140
./output/405309
./output/405310
./output/405319
./output/500550
./output/500589
./output/500610

केवल 8 ही क्यों छपे थे और मेरा सवाल यह है कि इस प्रकार के लूप से फिक्स नंबर तत्वों का चयन कैसे करें।

0
David Z 9 मई 2018, 16:41

2 जवाब

सबसे बढ़िया उत्तर

*[0..9] एक 0, 9, या . में समाप्त होने वाले लूप पर लूप करता है। यदि आपने *{0..9} लिखा होता, जो 0 से 9 तक के अंक से समाप्त होने वाले अंकों के ऊपर लूप होता - करीब, लेकिन फिर भी सही नहीं है।

इस लूप को आज़माएं, जो लूप में पहले 10 निर्देशिका नामों को पढ़ता है। यह थोड़े अटपटा है। प्राथमिक विचार while read ... < <(cmd) का उपयोग कमांड के आउटपुट को एक बार में एक लाइन पढ़ने के लिए कर रहा है। IFS= और -r व्हॉट्सएप और बैकस्लैश के साथ निर्देशिका नामों को सही ढंग से संभालने के लिए पांडित्यपूर्ण बिट्स हैं।

while IFS= read -r dir; do
    echo "$dir"
done < <(ls output/*/ | head -10)

या काउंटर के साथ इस अधिक सरल संस्करण का उपयोग करें:

i=0
for dir in output/*/; do
    echo "$dir"
    ((++i < 10)) || break
done

या यह एक सरणी में निर्देशिका संग्रहीत करता है:

dirs=(output/*/)
for dir in "${dirs[@]::10}"; do
    echo "$dir"
done
2
John Kugelman 9 मई 2018, 16:57

आप एक काउंटर बना सकते हैं:

#!/bin/bash

i=0;
for d in ./output/*/;
do
    echo $d
    echo ""

    if [[ i == 10 ]]; then
      break
    fi
    i+=1
done

इससे आपको 10 फोल्डर मिलना तय है।

मैं केवल निर्देशिकाओं से मेल खाने के लिए अंतिम बैकस्लैश करना बहुत महत्वपूर्ण हूं।

0
z3nth10n 9 मई 2018, 16:46