मैं एक /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
, जो लूप को चलने से भी रोकेगा।