शेल स्क्रिप्ट में चर असाइनमेंट में रिक्त स्थान


17

नीचे चर कार्य के बीच अंतर क्या है?

var=23
var =23
var= 23
var = 23

क्या असाइनमेंट ऑपरेटर के आसपास अंतरिक्ष में कोई अंतर है?


अधिकांश प्रोग्रामिंग भाषाओं में इससे कोई अंतर नहीं पड़ेगा ... क्या वास्तव में शुरू करने के लिए कोई अंतर है? इसके अलावा, आप यहाँ oldschool बात कर रहे हैं? नहीं ऐश / zsh / मार या अन्य नई चीजें?
सेसेंट्री

केवल पहला उदाहरण एक चर सेट करता है।
डिस्प्लेनेम

तो पिछले 3 सिर्फ एक वाक्यविन्यास त्रुटि फेंक नहीं है? या क्या वे वास्तव में अर्थ रखते हैं?
14

2
@Cestarian वे कुछ मतलब हो सकता है, यदि आप नामक आदेश है varतो var =23पास होगा =23वर के लिए, और var = 23पास होता =और 23वर के लिए। या, अगर आपके पास नामक आदेश var=तो var= 23पास होता 23कमांड के लिए var=
DisplayName

1
@ कैस्टरियन द्वारा प्रतिस्थापित bash, जो shसभी चार मामलों में ठीक वैसा ही करता है ।
pfnuesel

जवाबों:


14

यह बहुत शेल पर निर्भर करता है। यदि हम केवल 4 मुख्य शेल परिवारों को देखते हैं (बॉर्न, csh, आरसी, मछली):

बॉर्न परिवार

यही कारण है कि बॉर्न शैल और अपने सभी वेरिएंट और ksh, bash, ash/ dash, zsh, yash

  • var=23: यह सही वैरिएबल असाइनमेंट सिंटैक्स है: एक शब्द जिसमें बिना अक्षरों के, अंकों या अंडरस्कोर होते हैं, उसके बाद एक अनक्वॉट =होता है जो कमांड तर्क से पहले दिखाई देता है (यहां यह अपने आप है)
  • var =23तर्क के रूप में varकमांड =23( एक विशेष ऑपरेटर को छोड़कर, zshजहां कमांड =somethingके पथ पर विस्तार होता है something। यहां, आपको एक त्रुटि प्राप्त होने 23की संभावना है क्योंकि एक वैध कमांड नाम होने की संभावना नहीं है)।
  • var= 23: var=एक कमांड नाम के बाद एक असाइनमेंट 23। इसका अर्थ है कि इसके पर्यावरण ( रिक्त मान के साथ पर्यावरण चर) के 23साथ निष्पादित करना ।var=var
  • var = 23, varकमांड के साथ =और 23तर्क के रूप में। echo = 23उदाहरण के लिए प्रयास करें ।

Csh परिवार

cshऔर tcsh। वैरिएबल असाइनमेंट में set var = valueस्केलर वेरिएबल्स के लिए सिंटैक्स, set var = (a b)एरेज़ के लिए, setenv var valueपर्यावरण वेरिएबल्स के लिए, @ var=1+1असाइनमेंट और अंकगणितीय मूल्यांकन के लिए होते हैं।

इसलिए:

  • var=23केवल var=23कमांड का आह्वान कर रहा है ।
  • var =23तर्क के रूप में varकमांड को आमंत्रित कर रहा =23है।
  • var= 23तर्क के रूप में var=कमांड को आमंत्रित कर रहा 23है
  • var = 23तर्कों के varसाथ =और आदेश को लागू कर रहा 23है।

आर सी परिवार

वह है rc, esऔर akanga। उन के गोले में, चर सरणियों हैं और कार्य के साथ कर रहे हैं var = (foo bar), के साथ var = fooके लिए कम किया जा रहा var = (foo)है (एक साथ एक सरणी fooतत्व) और var =के लिए कम var = ()(कोई तत्व के साथ सरणी, उपयोग var = ''एक खाली तत्व के साथ एक सरणी के लिए)।

किसी भी स्थिति में, रिक्त स्थान (टैब या टैब) के आसपास =की अनुमति है और वैकल्पिक है। तो उन गोले में वे 4 कमांड समतुल्य हैं और var = (23)एक तत्व के साथ एक सरणी असाइन करने के लिए बराबर हैं 23

मछली

में fish, चर असाइनमेंट सिंटैक्स है set var value1 value2। जैसे rc, चर, सरणियाँ हैं।

तो व्यवहार के साथ भी ऐसा ही होगा csh, सिवाय इसके कि fishआप =इसके नाम के साथ कमांड नहीं चलने देंगे । यदि आपके पास ऐसा कोई आदेश है, तो आपको shउदाहरण के लिए इसे लागू करने की आवश्यकता है sh -c 'exec weird===cmd':।

सब तो var=23और var= 23यदि आपको कोई त्रुटि दे देंगे, var =23कॉल करेंगे varके साथ आदेश =23तर्क के रूप में और var = 23कॉल करेंगे varके साथ आदेश =और 23तर्क के रूप में।


8

var=2323 को चर प्रदान करता है var

var =23varतर्क के साथ कमांड (या उपनाम, या फ़ंक्शन) चलाने की कोशिश करता है=23

var = 23ditto, लेकिन तर्क =और23

var= 23varरिक्त चर के लिए पर्यावरण चर सेट करता है, फिर कमांड चलाता है23

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


3
  • var=23 किसी वैरिएबल पर मान निर्दिष्ट करने के लिए सही सिंटैक्स है।
  • var =23आदेश varके लिए =23विकल्प / तर्क के साथ कमांड के रूप में माना जाता है var(हालांकि तर्क / विकल्प के लिए सही / मानक सिंटैक्स है -optionया --option)
  • var= 23कुछ भी नहीं बताएगा varक्योंकि व्हाइट-स्पेस असाइनमेंट की प्रक्रिया को तोड़ता है और 23इसे एक अन्य कमांड माना जाएगा। समाधान नहीं है var=\ 23या var=' 23'सफेद-अंतरिक्ष के भंडारण के लिए।
  • var = 232 nd मामले में चर्चा के समान प्रभाव है ।

    वास्तव में आस-पास अंतरिक्ष के इस प्रकार का उपयोग =आमतौर पर अंदर परीक्षण स्थिति में किया जाता है [[ ]]। बैश के लिए उदाहरण:

    string1 = string2
           True if the strings are equal.  = should be used with the test command  for  POSIX  conformance.  
           When used with the [[ command, this performs pattern matching as described above (Compound Commands).

और उसके बाद सफेद-अंतरिक्ष का व्यवहार =आपके शेल और प्रोग्रामिंग भाषाओं पर निर्भर करता है।

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