2011-09-23 18 views
16

मेरे पास एक बैश स्क्रिप्ट है जो उपयोगकर्ता से फ़ाइलों का एक सेट प्राप्त करती है। ये फ़ाइलें कभी-कभी उनके नामों में रिक्त स्थान वाली निर्देशिकाओं के अंतर्गत होती हैं। दुर्भाग्यवश this question के विपरीत सभी फ़ाइल नाम कमांड लाइन इंटरफ़ेस के माध्यम से पारित किए जाते हैं। आइए मान लें कि पथ सही ढंग से उद्धृत किए गए हैं क्योंकि वे उपयोगकर्ता द्वारा पारित किए जाते हैं, इसलिए रिक्त स्थान (उद्धृत रिक्त स्थान के लिए सहेजें) पथ के बीच delimiters हैं। मैं इन पैरामीटर को मेरी बैश स्क्रिप्ट के भीतर एक सबराउटिन में कैसे भेजूं जिससे उद्धृत रिक्त स्थान संरक्षित हो?बैश: पैरामीटर के रूप में रिक्त स्थान के साथ पथ गुजर रहा है?

उत्तर

19
#! /bin/bash 

for fname in "[email protected]"; do 
    process-one-file-at-a-time "$fname" 
done 

उद्धरणों के अत्यधिक उपयोग पर ध्यान दें। यह सब जरूरी है।

एक अन्य कार्यक्रम के लिए सभी तर्क पासिंग भी सरल है:

process-all-together "[email protected]" 

मुश्किल मामला है जब आप छमाही में तर्क विभाजित करना चाहते हैं। इसके लिए एक साधारण पॉज़िक्स खोल में बहुत अधिक कोड की आवश्यकता होती है। लेकिन शायद बैश में कुछ विशेष विशेषताएं हैं।

+0

धन्यवाद; अगर मुझे थोक में संसाधित करने की ज़रूरत है तो क्या होगा? – fbrereto

+0

मैंने अपना जवाब अपडेट किया। –

+1

इसके अलावा, सुनिश्चित करें कि सबराउटिन ठीक से सब कुछ दोहराता है, उदा। 'प्रक्रिया-एक-फ़ाइल-पर-एक-समय() {सीपी "$ 1" "बैकअपडीर/$ (बेसनाम" $ 1 ")"; } ' –

0
"$var" 

उदाहरण के लिए,

$ var='foo bar' 

$ perl -E'say "<<$_>>" for @ARGV' $var 
<<foo>> 
<<bar>> 

$ perl -E'say "<<$_>>" for @ARGV' "$var" 
<<foo bar>> 
3

आप "[email protected]", जो [email protected] विस्तार हो रहा है, लेकिन सफेद-अंतरिक्ष करने वाले का हवाले से संरक्षण की विशेष वाक्यविन्यास है चाहते हैं (यह सब के साथ एक विशाल स्ट्रिंग का निर्माण नहीं करता इसमें तर्क)।

bash-script.sh AFile "Another File With Spaces" 

तो अपनी स्क्रिप्ट में आप चीजों की तरह कर सकते हैं::

for f in "[email protected]"; do 
    echo "$f"; 
done 

और उत्पादन की दो पंक्तियाँ (5 नहीं) मिलता है तो किसी की तरह अपनी स्क्रिप्ट कॉल कर सकते हैं।

पढ़ें विशेष पैरामीटर के बारे में पैरा "@" यहाँ: http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters

0

ब्रावो @Roland। आपके समाधान के लिए बहुत कुछ

यह वास्तव में काम करता है!

मैंने एक साधारण स्क्रिप्ट फ़ंक्शन लिखा जो नॉटिलस के साथ दिया गया पथ खोलता है।

और मैं सिर्फ मुख्य कार्य में इस "सहायक" -किसी लूप के साथ एक समारोह नेस्ट किया है:

fmp() { 

    fmp2() { 
     nautilus "[email protected]"; 
    }; 

    for fname in "[email protected]"; 
    do   
     fmp2 "$fname";   
    done; 
} 

अब मैं सिर्फ बदल कर मेरे सभी लिपियों रास्तों के साथ निपटने के काम करने के लिए कर सकती हूं इन हेल्पर-फॉर-लूप के साथ फ़ंक्शन द्वारा लिपटे नेस्टेड फ़ंक्शंस में।