2010-02-15 14 views
364

में त्रुटि नहीं मिला मैं इस स्क्रिप्ट test.sh कहा जाता है:कमान बैश चर काम

test.sh: line 2: STR: command not found 

क्या मैं गलत कर रहा हूँ:

#!/bin/bash 
STR = "Hello World" 
echo $STR 

जब मैं sh test.sh चलाने मैं इस मिल सकता है? मैं बेहद बुनियादी/शुरुआती बैश स्क्रिप्टिंग ट्यूटोरियल ऑनलाइन देखता हूं और इस प्रकार वे चर घोषित करने के लिए कहते हैं ... इसलिए मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं।

मैं उबंटू सर्वर 9 .10 पर हूं। और हाँ, बैश /bin/bash पर स्थित है।

+21

मुझे खुशी है कि आपने सवाल पूछा था, आप वहां केवल एकमात्र बैश नोब नहीं हैं! –

+3

उस प्रश्न पूछने के लिए धन्यवाद। यह शर्मिंदा होने का सवाल नहीं है। मैं कार्यालय में देर रात काम कर रहा हूं और इसका उत्तर देने के लिए मेरे आस-पास कोई बैश विशेषज्ञ नहीं है। –

+1

इन दिनों (लगभग सात साल बाद!) एक एफओएसएस लिटर/विश्लेषक है जिसे [शेलचेक] (http://www.shellcheck.net) कहा जाता है जो इस और अन्य सामान्य वाक्यविन्यास मुद्दों को स्वत: पता लगाएगा। इसका उपयोग ऑनलाइन या ऑफलाइन स्थापित किया जा सकता है और आपके संपादक में एकीकृत किया जा सकता है। –

उत्तर

704

आप अपने '=' पर हस्ताक्षर के साथ स्पेस नहीं हो सकता।

जब आप लिखें:

STR =foo 
:

STR = "foo" 

बैश 2 तर्कों (तार '=' और 'foo')

जब आप लिखने के साथ एसटीआर नाम के एक आदेश को चलाने के लिए कोशिश करता है

बैश 1 तर्क (स्ट्रिंग '= foo') के साथ एसटीआर नामक कमांड चलाने की कोशिश करता है

जब आप wr ite:

STR= foo 

बैश अपने पर्यावरण में खाली स्ट्रिंग पर एसटीआर सेट के साथ कमांड foo चलाने की कोशिश करता है।

मैं या अगर यह स्पष्ट करने के लिए मदद करता है यकीन नहीं है अगर यह मात्र कहानियो है, लेकिन ध्यान दें कि:

  1. पहले आदेश के लिए बिल्कुल बराबर है: STR "=" "foo",
  2. दूसरे रूप में ही है STR "=foo",
  3. और अंतिम STR="" foo के बराबर है।

sh language spec, section 2.9.1 राज्यों के प्रासंगिक अनुभाग:

ए 'साधारण आदेश "किसी भी क्रम में, वैकल्पिक चर कार्य और पुनर्निर्देशन का क्रम है, वैकल्पिक रूप से, शब्द और पुनर्निर्देशन के बाद एक नियंत्रण द्वारा समाप्त ऑपरेटर।

उस संदर्भ में, word वह आदेश है जो बैश चलाने जा रहा है। = (स्ट्रिंग की शुरुआत के अलावा किसी भी स्थिति में) जो कोई रीडायरेक्शन नहीं है, एक वैरिएबल असाइनमेंट है, जबकि कोई भी स्ट्रिंग जो रीडायरेक्शन नहीं है और इसमें = कोई कमांड नहीं है। STR = "foo" में, STR एक परिवर्तनीय असाइनमेंट नहीं है।

+0

यदि आपके पास एक नाम के साथ एक वैरिएबल है जो "-" है, तो वही त्रुटि होती है। उस स्थिति में, समाधान "0" – chomp

+0

chomp @ को हटाने के लिए है http://pubs.opengroup.org/onlinepubs/9699919799/ की धारा 2.10.10 के नियम 7 बी में "यदि सभी वर्ण '=' फ़ॉर्म से पहले हैं वैध नाम (एक्सबीडी नाम देखें), टोकन ASSIGNMENT_WORD वापस कर दिया जाएगा। " Http://pubs.opengroup.org/onlinepubs/9699919799/ की धारा 3.231 के लिंक के बाद, हम "शेल कमांड भाषा में, एक शब्द जिसमें पोर्टेबल चरित्र सेट से अंडरस्कोर, अंक और वर्णमाला शामिल हैं। पहला एक नाम का चरित्र एक अंक नहीं है। " तो 'FOO-BAR = qux' शब्द एक परिवर्तनीय असाइनमेंट नहीं है क्योंकि' FOO-BAR 'मान्य नाम नहीं है। –

+1

मैं शुरुआती लोगों के लिए हमेशा एक आम मुद्दे के लिए इस स्पष्ट स्पष्टीकरण को पुरस्कृत करने के लिए एक बक्षीस की पेशकश कर रहा हूं (ठीक है, और जब भी मैं इसे लिंक करना चाहता हूं तो इसे तेज़ी से ढूंढने में सक्षम होने के लिए: डी)। चीजों को आसान बनाने के लिए धन्यवाद! – fedorqui

130

= संकेत के साथ स्पेस ड्रॉप:

#!/bin/bash 
STR="Hello World" 
echo $STR 
+7

यह मजाकिया है हालांकि, 'सेट foo = bar' के रूप में विंडोज बैच फ़ाइलों में भी एक आम गलती है-और वहां बैच भाषा का उपहास है ;-) – Joey

+0

धन्यवाद @joey। मैं एक शेल स्क्रिप्ट लिखने में फंस गया था जहां मैं "=" के बाद रिक्त स्थान के साथ चर शुरू कर रहा था। आपने मेरा दिन –

+0

बचाया क्यों बाश बाएं क्षेत्र में संख्या स्वीकार नहीं करता है? जैसे 3 = "हैलो वर्ल्ड", यह कमांड के बारे में शिकायत करता है – Freedo

5

इंटरैक्टिव मोड सब कुछ ठीक

$ str="Hello World" 
$ echo $str 
Hello World 

जाहिर लग रहा है! जैसा कि जोहान्स ने कहा, '=' के चारों ओर कोई जगह नहीं है। मामले में चारों ओर '=' किसी भी जगह नहीं है तो इंटरैक्टिव मोड में `

कोई कमांड 'str' पाया के रूप में त्रुटियों देता

+1

लेकिन ध्यान दें कि ओपी 'एसटीआर = "हैलो वर्ल्ड" कह रहा था, इसलिए यह उत्तर यहां लागू नहीं होता है। – fedorqui

+0

@Arkapravo इंटरैक्टिव मोड का अर्थ क्या है, क्या इसमें '$ 'चिह्न –

+0

@ कसुनसिंबलपतिया" इंटरैक्टिव मोड "के साथ कुछ करने का मतलब है, जिसका अर्थ है कि उन आदेशों को वास्तविक टर्मिनल में टाइप करना, स्क्रिप्ट में नहीं। – numbermaniac

1

जब आप किसी भी चर तो परिभाषित आगे रहने के लिए की जरूरत नहीं है किसी भी अतिरिक्त जगह में।

उदा।

name = "Stack Overflow" 
// it is not valid, you will get an error saying- "Command not found" 

तो हटाने रिक्त स्थान:

name="Stack Overflow" 

और यह ठीक काम करेंगे।

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