मैं एक /bin/shशेल स्क्रिप्ट लिखना चाहता हूं जो वाइल्डकार्ड से मेल खाती किसी भी फाइल को संभाल लेगी। 1 या अधिक मिलान वाली फ़ाइलों को संभालना आसान है। हालाँकि, मुझे 0 मिलान फ़ाइलों के मामले को संभालना अजीब लग रहा है।
स्पष्ट निर्माण है:
#!/bin/sh
for f in *.ext; do
handle "$f"
done
जहाँ *.extएक या एक से अधिक भाव हो सकते हैं, जो शेल फ़ाइल पथों की तुलना करता है, और handleएक शेल कमांड है, जो किसी मौजूदा फ़ाइल को पथ दिए जाने पर सही ढंग से चलता है, लेकिन विफल रहता है यदि वह पथ दे जो फ़ाइल में मैप नहीं करता है। (इस मामले में जो इस सवाल को उकसाता है, वे हैं *.flacऔर ffmpeg, लेकिन मुझे लगता है कि कोई फर्क नहीं पड़ता।)
अगर वहाँ फ़ाइलों मिलान कर रहे हैं foo.ext, bar.extहै, तो इस स्क्रिप्ट करता है
handle "foo.ext"
handle "bar.ext"
जैसा सोचा था। हालाँकि, यदि कोई मेल नहीं होती है, तो यह स्क्रिप्ट एक त्रुटि संदेश देती है, जैसे
handle: *.ext: No such file or directory
मुझे लगता है कि मैं समझता हूं कि ऐसा क्यों होता है: बैश मैन पेज (जो मुझे लगता है कि मान्य /bin/shभी है) कहते हैं, "निम्नलिखित शब्दों की सूची का inविस्तार किया गया है, वस्तुओं की एक सूची तैयार की जा रही है। ... यदि परिणामों का अनुसरण खाली में किया जाता है। सूची, कोई आदेश निष्पादित नहीं किए जाते हैं, और वापसी की स्थिति 0. है। " जाहिर है जब *.ext"विस्तारित" होता है, तो परिणामों की सूची में *.extखाली सूची के बजाय शामिल है । लेकिन यह नहीं समझाता कि इसे कैसे रोकें।
(अपडेट: sh (1)हिरलूम प्रोजेक्ट का एक मैन पेज है जो बॉर्न शेल का वर्णन करता है sh, न कि बाद में फिर से बॉर्न शेल का bash। फ़ाइल नाम जनरेशन के तहत , यह स्पष्ट रूप से कहता है, "यदि कोई फ़ाइल नाम नहीं मिला है जो पैटर्न से मेल खाता है तो शब्द बचा है। अपरिवर्तित। "यह बताता है कि सूची में shएक *.extपैटर्न क्यों छोड़ता है ।"
इस लूप को लिखने के लिए एक कॉम्पैक्ट, मुहावरेदार तरीका क्या है ताकि यह कोई मेल नहीं होने वाली फ़ाइलों के साथ शून्य बार चले, लेकिन प्रत्येक मिलान फ़ाइल के लिए एक बार चलेगा? बेहतर अभी तक, क्या कई पैटर्न के साथ काम करेंगे जैसे:
for f in *.ext1 special.ext1 *.ext2; do ...
/bin/shपोर्टेबिलिटी के लिए मैं सिंटैक्स के साथ संगत का उपयोग करना पसंद करता हूं । मैं मैक ओएस एक्स 10.11.6 का उपयोग कर रहा हूं, लेकिन मैं सिंटैक्स की उम्मीद कर रहा हूं जो किसी भी यूनिक्स जैसे ओएस पर काम करता है।
मैं इस तरह के एक लूप लिखने के लिए अनाड़ी, गैर-मुहावरेदार तरीकों के साथ आया हूं। अगर मुझे तुरंत अच्छे उत्तर नहीं मिलते हैं, तो मैं रिकॉर्ड के लिए, उत्तर के रूप में योगदान करूँगा।
/bin/sh, लेकिन यह पूर्ण नहीं है। मुझे लगता है कि फॉर्म का जवाब "बैश पर स्विच करें, फिर ऐसा करें" सहायक है। यह उतना अच्छा नहीं होगा जितना कि यह कहा जाता है, "यहाँ यह श में कैसे करना है", लेकिन शायद ऐसा जवाब मौजूद नहीं है।
nullglob, जो लूप को चलने से भी रोकेगा।