2012-10-31 8 views
5

मुझे सीएसएच के साथ कुछ बुनियादी करने में परेशानी हो रही है।सीएसएच एक सरणी में स्ट्रिंग जोड़ रहा है, व्हाइटस्पेस परेशानी

set newCmd = "$expansionCmd –option1 –option2 …" 

और मैं इन तार है, जो मैं बाद में निष्पादित करने के लिए चाहते हैं की एक सरणी बना रहा हूं:

set expansionCmdList = ($expansionCmdList[*] "$newCmd") 
#I also tried without quotes, e.g. just $newCmd 

अंत में मैं अधिक पुनरावृति और इन आदेश पर अमल करने की कोशिश: मैं एक स्ट्रिंग है

foreach exCmd ($expansionCmdList) 
    `exCmd` #execute it in the shell 
end 

हालांकि समस्या यह है कि सरणी प्रविष्टियां पूर्ण स्ट्रिंग नहीं हैं, लेकिन स्ट्रिंग का प्रत्येक भाग व्हाइटस्पेस से अलग होता है, यानी पहली प्रविष्टि केवल "$ विस्तार सीएमडी" है, अगली प्रविष्टि बी होगी ई "-option1" आदि

सी खोल का उपयोग करने के लिए अग्रिम में माफी, मेरी कंपनी का कोड बेस इसके साथ फंस गया है।

उत्तर

7

जब भी आप एक संपूर्ण सरणी का विस्तार कर रहे हों और अपने व्यक्तिगत तत्वों की पहचान को बरकरार रखना चाहते हैं, तो आपको विस्तार पर :q संशोधक की आवश्यकता है। अन्यथा, जैसे ही आप set expansionCmdList=($expansionCmdList[*] "$newCmd") जैसे कुछ करते हैं, सूची में सभी पिछले आदेश उनके घटक शब्दों में विभाजित होते हैं, जिनमें से प्रत्येक अब अपना स्वयं का सरणी तत्व है। सरल प्रदर्शन:

% set a = (a "b c" d) 
% echo $a[2] 
b c 
% set a = ($a[*] e) 
% echo $a[2] 
b 

ओह, आप अपने निष्पादन पाश तक पहुंचने से पहले सरणी को गड़बड़ कर चुके हैं। हालात :q साथ ज्यादा बेहतर जाना:

% set a = (a "b c" d) 
% set a = ($a:q e) 
% echo $a[2] 
b c 

आप पाश के लिए में एक ही संशोधक का उपयोग करने की आवश्यकता है:

foreach exCmd ($expansionCmdList:q) 

अंत में, `` exCmd एक कमांड सचमुच नाम "exCmd" चलाने के लिए कोशिश करता है। आप क्या करना चाहते हैं चर के मान को चलाता है। आप यहां अधिक सफेद जगहों में दुर्घटनाओं में भाग लेंगे, और आप प्रत्येक कमांड को सरणी बनाकर हल नहीं कर सकते क्योंकि सीएसएच सरणी के सरणी का समर्थन नहीं करता है। निष्पक्ष चेतावनी। लेकिन अगर आदेशों किसी भी उद्धरण की जरूरत नहीं है, यह काम करेगा:

$exCmd 
+1

धन्यवाद आदमी ... मैं कसम खाता हूँ केवल प्रलेखन मैं ग खोल पर मिल सकती है लोग कहते हैं कि सी खोल का उपयोग न करें। – JDS

+1

वैसे, स्क्रिप्टिंग के लिए सीएसएस का उपयोग न करने का एकमात्र महत्वपूर्ण शेष कारण यह है कि सीएसएस एक बहुत अच्छी पटकथा भाषा नहीं है ... इस तथ्य की तरह चीजों के कारण कि आपको किसी प्रकार की सबप्रोग्राम क्षमता रखने के लिए नटों में उपनाम मोड़ना है । लेकिन अगर आपके पास यही है, तो आपके पास यही है। और इसमें पॉज़िक्स शैल किए जाने से पहले एरे और अंतर्निहित अंकगणित थे। :) –

+0

ध्यान दें कि '$ {array} का उपयोग करके: q' काम नहीं करेगा - यह' $ arr: q' होना चाहिए। –

0

मार्क समाधान सबसे अनुप्रयोगों के लिए स्पष्ट रूप से बेहतर है, लेकिन वहाँ एक और विकल्प है। foreach सीधे उपयोग करने के बजाय, सरणी के आकार मिलता है और अनुक्रम के माध्यम से पुनरावृति:

set BUILD_MATRIX = ("makefile.make:make --jobs --makefile=makefile.make" \ 
        "Makefile:make --jobs --makefile=Makefile" \ 
        "build.xml:ant") 

foreach i (`seq ${#BUILD_MATRIX}`) 
    echo $i 
    echo $BUILD_MATRIX[$i] 
end 

(Accessing array elements with spaces in TCSH से नकल)

संबंधित मुद्दे