2015-05-17 4 views
5

घोषित नहीं करता है मुझे एक बैश स्क्रिप्ट के साथ समस्या है। मैं जो करता हूं वह इस तरह के वैरिएबल असाइन करता है।मान्य पहचानकर्ता बैश

for ((i=START;i<=END;i++) 
declare var$i=$(something) 
done 

और यह काम करता है, लेकिन अब मुझे फिनिश वर्णों जैसे å, ä, ö के साथ समस्या है। क्या घोषित कहना है कि यह

bash:declare 'wörd' not a valid identifier 

की तरह कुछ हालांकि यह ठीक काम करता है अगर मैं इसे पसंद करते हैं इस

declare var2=$(sömething) 

मैं एसईडी साथ पात्रों में बदल सकते हैं लेकिन यह उन्हें हमेशा की तरह बेहतर है, तो यह है एक अंतिम उपाय समाधान। तो मुझे पता है कि मैं कैसे की तरह

var$i 
फिनिश पात्रों के साथ

चर असाइन कर सकते हैं करना चाहते हैं। word शब्द मेरे आदेश 'कुछ' के आउटपुट का हिस्सा है। जब दो शब्द या अधिक होते हैं तो केवल शब्द (ओं) जिसमें वर्ण ö, ä और इतने पर होते हैं वे चर को असाइन नहीं किए जाते हैं, इसलिए यदि आदेश का आउटपुट "कुछ word" था तो एकमात्र चीज जो दिखाया जा रहा है गूंज के साथ कुछ है।

+1

कैसे करते हैं फिनिश वर्ण में दिखाने '$ i', और आप ऐसा क्यों करना चाहते हैं? – Ryan

+0

मैं आउटपुट असाइन करता हूं f var1, var2 के लिए कुछ आदेश और फिर गणना करते हैं। क्षमा करें मैं पहले भाग पर आपका मतलब क्या नहीं है। – jim

+1

'wörd' कहां आता है? – Ryan

उत्तर

6

bash बस ए-जेड, ए-जेड, 0-9, और _ के अलावा वर्णों का उपयोग करने वाले पहचानकर्ताओं को अनुमति नहीं देता है। हालांकि, आपके द्वारा वर्णित त्रुटि उस सीमा का एक दुष्प्रभाव है। declare एक आदेश है जो एक स्ट्रिंग तर्क लेता है कि एक असाइनमेंट स्टेटमेंट की तरह दिखता है, लेकिन अर्थशास्त्र थोड़ा अलग है। इस आदेश पर विचार करें:

foo() { 
    echo "something wörd" 
} 

एक काम बयान में दाएँ हाथ की ओर शब्द बंटवारे से गुजरना नहीं करता है, तो आप आदेश प्रतिस्थापन उद्धृत करने के लिए नहीं है। ठीक निम्नलिखित काम करता है:

$ word3=$(foo) 
$ echo "$word" 
something wörd 
declare साथ

, हालांकि, आदेश प्रतिस्थापन करता शब्द बंटवारे से गुजरना है, इसलिए जब आप लिखते हैं

$ i=3 
$ declare word$i=$(foo) 

यह आदेश

$ declare word3=something wörd 

के बराबर है जो दोdeclare के लिए नाम पास करता है बनाएँ, word3 (जो एक मान प्राप्त करता है) और wörd (जो एक अवैध नाम है)। declare word3="something wörd" ठीक काम करेगा; शेल का शब्द-विभाजन पहले से ही declare द्वारा किया जाता है तर्क प्राप्त करता है।

declare के साथ, तो आपको नए चर के लिए मान के रूप में पूरे आउटपुट के रूप में माना जाने के लिए कमांड प्रतिस्थापन (या पूरी स्ट्रिंग) को उद्धृत करने की आवश्यकता है।

$ i=3 
$ declare "word$i=$(foo)" 
$ echo "$word3" 
something wörd 
+1

बैश पहचानकर्ताओं के बारे में दावा '[ए-ज़ा-जेड _] [ए-ज़ा-जे 0-9 _] *' तक सीमित नहीं है। बैश किसी पहचानकर्ता को किसी एकल-बाइट चरित्र से शुरू करने की अनुमति देता है जो वर्तमान लोकेल में 'इस्लाफा' है, और किसी भी चरित्र के साथ जारी रखने के लिए 'इस्लामम' है। यदि लोकेल आईएसओ -885 9 -1 था, तो स्कैंडिनेवियाई, फ्रेंच, पुर्तगाली और स्पेनिश वर्णमाला पत्र ठीक काम करेंगे। हालांकि, यह यूटीएफ -8 लोकेशंस के साथ काम नहीं करेगा क्योंकि गैर-हम-एसीआई वर्णमाला वर्ण मल्टीबाइट हैं। – rici

+0

धन्यवाद। मुझे पता था क्योंकि मैं जवाब के उस हिस्से को टाइप कर रहा था, यह अनावश्यक रूप से सख्त लग रहा था, लेकिन मैंने इसे गैर-अंग्रेजी लोकेल के साथ परीक्षण करने के लिए नहीं सोचा था। – chepner

+0

परीक्षण करना आसान नहीं है, या तो, क्योंकि अधिकांश सिस्टम इन दिनों यूटीएफ -8 कंसोल I/O का उपयोग करते हैं, भले ही लोकेल बदल दिया गया हो। तो आपको एक आईएसओ -885 9 -1 फ़ाइल बनाने के साथ-साथ लोकेल सेट करना होगा। लेकिन यह काम करता है, ईमानदार। (और Posix भी इसे काम करने की आवश्यकता है।) – rici

0

कमांड लाइन में /bin/bash का उपयोग कर अपनी स्क्रिप्ट चलाने की कोशिश करें के बजाय अगर sh (:

के बजाय:

>> sh script.sh 

प्रयास करें:

>> /bin/bash script.sh