मैंने सोचा कि यह सरल होगा - लेकिन यह मेरी अपेक्षा से अधिक जटिल साबित हो रहा है।
मैं एक विशेष प्रकार की सभी फाइलों को एक निर्देशिका में बदलना चाहता हूं, इसलिए मैं यह लिखता हूं:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
यह तब तक काम करता है जब तक कि निर्देशिका में कम से कम एक मिलान फ़ाइल हो। हालाँकि अगर कोई मेल नहीं होती है, तो मुझे यह मिलता है:
current file is *.zip
मैंने तब कोशिश की:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
लूप का शरीर निष्पादित नहीं करता है जब कोई फाइल नहीं होती है, तो मुझे ls से एक त्रुटि मिलती है:
ls: *.zip: No such file or directory
मैं एक लूप कैसे लिखता हूं जो साफ-सफाई से बिना मिलान वाली फाइलों को संभालता है?
FILES=
ls * .zip ; for fname in "${FILES}"...
करता हूं, लेकिन यह अपेक्षित रूप से काम नहीं करता हैfor fname in *.zip ; do....
for file in *.zip
, नहीं `ls ...`
। @ cuonglm का सुझाव इतना है कि *.zip
पैटर्न कुछ भी फ़ाइल से मेल नहीं खाने पर कुछ भी नहीं फैलता है। ls
तर्कों के बिना वर्तमान निर्देशिका को सूचीबद्ध करता है।
ls
आम तौर पर बचाए जाने के उत्पादन को पार्स क्यों किया जाता हैls
: पार्स क्यों नहीं ? ; उस पृष्ठ के शीर्ष के पास लिंक को बशगाइड के पारसिंगल लेख के साथ भी देखें।
shopt -s nullglob
लूप के लिए दौड़ने से पहले जोड़ें ।