कमांड को बैश वेरिएबल असाइनमेंट में त्रुटि नहीं मिली


519

मेरे पास यह स्क्रिप्ट है जिसे test.sh कहा जाता है:

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

जब मैं दौड़ता sh test.shहूँ तो मुझे यह मिलता है:

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

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

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


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

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

3
इन दिनों (लगभग सात साल बाद!) एक FOSS लिंटर / विश्लेषक है जिसे शेलचेक कहा जाता है जो इस और अन्य सामान्य वाक्यविन्यास मुद्दों को स्वतः प्रकाशित करेगा। इसका उपयोग ऑनलाइन या ऑफ़लाइन स्थापित किया जा सकता है और आपके संपादक में एकीकृत किया जा सकता है।
वह दूसरा लड़का

यह भी देखें stackoverflow.com/questions/26971987/...
tripleee

: मैं उपयोग करने के लिए आपको सलाह देते हैं #!/usr/bin/env bashबजाय सीधे डालने की #!/bin/bashजब तक आप पूरी तरह से सुनिश्चित करें कि आपके कर रहे हैं bashमें है /bin: इस उत्तर के कारण stackoverflow.com/a/21613044/3589567
ऐलेजैंड्रो Blasco

जवाबों:


927

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

जब आप लिखते हैं:

STR = "foo"

bash STR नाम की एक कमांड को 2 तर्कों (स्ट्रिंग '=' और 'foo') के साथ चलाने की कोशिश करता है।

जब आप लिखते हैं:

STR =foo

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

जब आप लिखते हैं:

STR= foo

bash अपने वातावरण में खाली स्ट्रिंग में STR सेट के साथ कमांड फू चलाने की कोशिश करता है।

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

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

Sh भाषा युक्ति का प्रासंगिक खंड , खंड 2.9.1 बताता है:

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

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


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

1
chomp @ in नियम 7b of अनुभाग 2.10.10 of pubs.opengroup.org/onlinepubs/9699919799 "यदि सभी वर्ण पूर्ववर्ती = = 'एक वैध नाम बनाते हैं (XBD नाम देखें), टोकन ASSIGNMENT_WORD वापस आ जाएगा।" की धारा 3.231 के लिए लिंक के बाद pubs.opengroup.org/onlinepubs/9699919799 , हम पाते हैं "शेल कमांड भाषा में, पोर्टेबल वर्ण सेट से की अंडरस्कोर, अंक, और alphabetics केवल मिलकर एक शब्द। एक नाम का पहला वर्ण है अंक नहीं। " इसलिए यह शब्द FOO-BAR=quxएक वेरिएबल असाइनमेंट FOO-BARनहीं है क्योंकि यह मान्य नाम नहीं है।
विलियम पुरसेल

2
मैं शुरुआती (अच्छी तरह से, और जब भी मैं इसे लिंक करना चाहता हूं, तो इसे तेजी से खोजने में सक्षम होने के लिए इस स्पष्ट स्पष्टीकरण को पुरस्कृत करने के लिए एक इनाम की पेशकश कर रहा हूं। चीजों को आसान बनाने के लिए धन्यवाद!
फेडोरक्वी 'SO रोकना नुकसानदेह'

1
@fedorqui धन्यवाद! मैं पूरी तरह से आश्वस्त नहीं हूं कि यह एक स्पष्ट व्याख्या है, और मुझे अक्सर आश्चर्य होता है कि क्या इसे सरल बनाया जा सकता है।
विलियम पर्ससेल

159

=साइन के चारों ओर रिक्त स्थान छोड़ें :

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

9
हालाँकि, यह मज़ेदार है, क्योंकि set foo = barWindows बैच फ़ाइलों में भी एक सामान्य गलती है - और वहाँ बैच भाषा का उपहास किया जाता है;;
जॉय

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

बाश क्यों छोड़ दिया क्षेत्र में संख्या स्वीकार नहीं करता है? 3 = "हैलो वर्ल्ड" की तरह, यह कमांड के बारे में शिकायत करता है जो नहीं मिला
फ्रीडो

6

इंटरेक्टिव मोड में सब कुछ ठीक लगता है:

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

जाहिर है (!) जैसा कि जोहान्स ने कहा, आसपास कोई जगह नहीं है =। मामले में आसपास कोई जगह है =तो इंटरैक्टिव मोड में यह त्रुटियों के रूप में देता है

कोई आदेश 'str' नहीं मिला


2
लेकिन ध्यान दें ओपी कह रहा था STR = "Hello World", इसलिए यह उत्तर यहां लागू नहीं होता है।
फेडोरक्वी 'एसओ

@Akkapravo इंटरएक्टिव मोड का अर्थ क्या है, क्या इसका $निशान के साथ कुछ करना है
कसुन सियामबलपिटिया

@KasunSiyambalapitiya "इंटरेक्टिव मोड" द्वारा उन्होंने वास्तविक टर्मिनल में उन कमांड टाइप करने का मतलब है, स्क्रिप्ट में नहीं।
नंबरमैन

5

मुझे पता है कि इसका उत्तर बहुत ही उच्च गुणवत्ता के साथ दिया गया है। लेकिन, संक्षेप में, आपके पास रिक्त स्थान नहीं हैं।

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

बराबर चिह्न के आसपास रिक्त स्थान के कारण काम नहीं किया। यदि आप चलाने के लिए थे ...

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

यह काम करेगा


2

जब आप किसी भी चर को परिभाषित करते हैं तो आपको किसी भी अतिरिक्त स्थान में नहीं रखना पड़ता है।

उदाहरण के लिए

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

तो रिक्त स्थान निकालें:

name="Stack Overflow" 

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.