लगता है कि बैश बिलिन के बारे में कुछ गलतफहमी है true, और अधिक विशेष रूप से, के बारे में कि कैसे कोष्ठक के अंदर भाव का विस्तार और व्याख्या करता है।
मिकू के जवाब में कोड का बाश बिलिन के साथ कोई लेना-देना नहीं है true, न /bin/trueही और न ही trueकमांड का कोई अन्य स्वाद । इस मामले में, trueएक साधारण चरित्र स्ट्रिंग से अधिक कुछ भी नहीं है, और trueकमांड / बिल्डिन को कोई कॉल कभी नहीं किया जाता है, न तो चर असाइनमेंट द्वारा, और न ही सशर्त अभिव्यक्ति के मूल्यांकन के द्वारा।
निम्न कोड कार्यात्मक रूप से मिकू के उत्तर में कोड के समान है:
the_world_is_flat=yeah
if [ "$the_world_is_flat" = yeah ]; then
echo 'Be careful not to fall off!'
fi
यहाँ केवल अंतर यह है कि चार वर्णों की तुलना 'y', 'e', 'a' और 'h' के बजाय 't', 'r', 'u', और 'e' से की जाती है। बस। कमांड या बिलिन नाम से पुकारे जाने का कोई प्रयास नहीं किया गया है yeah, और न ही (मिकू के उदाहरण में) किसी भी प्रकार की विशेष हैंडलिंग तब चल रही है जब बैश टोकन को पार्स करता है true। यह सिर्फ एक स्ट्रिंग है, और उस पर पूरी तरह से मनमाना है।
अद्यतन (2014-02-19): मिकू के उत्तर में लिंक का अनुसरण करने के बाद, अब मैं देखता हूं कि कुछ भ्रम कहां से आ रहा है। मिकू का जवाब एकल कोष्ठक का उपयोग करता है, लेकिन कोड स्निपेट वह लिंक करता है जो कोष्ठक का उपयोग नहीं करता है। यह सिर्फ है:
the_world_is_flat=true
if $the_world_is_flat; then
echo 'Be careful not to fall off!'
fi
दोनों कोड स्निपेट समान तरीके से व्यवहार करेंगे , लेकिन ब्रैकेट पूरी तरह से बदल जाते हैं जो हुड के नीचे चल रहा है।
यहाँ बाश प्रत्येक मामले में क्या कर रहा है:
कोई कोष्ठक नहीं:
- चर
$the_world_is_flatको स्ट्रिंग में विस्तारित करें "true"।
"true"कमांड के रूप में स्ट्रिंग को पार्स करने का प्रयास ।
trueकमांड को ढूंढें और चलाएं (या तो एक बेसिन या /bin/true, बैश संस्करण पर निर्भर करता है)।
trueकमांड के निकास कोड की तुलना करें (जो हमेशा 0 होता है) 0. याद रखें कि अधिकांश गोले में, 0 का निकास कोड सफलता को इंगित करता है और कुछ भी विफलता का संकेत देता है।
- चूंकि एक्ज़िट कोड 0 (सफलता) था,
ifस्टेटमेंट thenक्लॉज़ निष्पादित करें
कोष्ठक:
- चर
$the_world_is_flatको स्ट्रिंग में विस्तारित करें "true"।
- अब पूरी तरह से विस्तारित सशर्त अभिव्यक्ति को पार्स करें, जो फॉर्म का है
string1 = string2। =ऑपरेटर बैश की है स्ट्रिंग तुलना ऑपरेटर। इसलिए...
- एक स्ट्रिंग तुलना करें
"true"और "true"।
- हां, दो तार समान थे, इसलिए सशर्त का मूल्य सही है।
ifकथन का thenखंड निष्पादित करें ।
नो-ब्रैकेट्स कोड काम करता है, क्योंकि trueकमांड 0 का एग्जिट कोड देता है, जो सफलता को इंगित करता है। ब्रैकेटेड कोड काम करता है, क्योंकि मान के दाईं ओर $the_world_is_flatस्ट्रिंग शाब्दिक के समान है ।true=
बस पॉइंट होम ड्राइव करने के लिए, कोड के निम्नलिखित दो स्निपेट पर विचार करें:
यह कोड (यदि रूट विशेषाधिकारों के साथ चलता है) आपके कंप्यूटर को रिबूट करेगा:
var=reboot
if $var; then
echo 'Muahahaha! You are going down!'
fi
यह कोड केवल "अच्छा प्रयास" प्रिंट करता है। रिबूट कमांड को नहीं कहा जाता है।
var=reboot
if [ $var ]; then
echo 'Nice try.'
fi
अद्यतन (2014-04-14) अंतर =और ==: AFAIK के बीच टिप्पणियों में प्रश्न का उत्तर देने के लिए , कोई अंतर नहीं है। ==ऑपरेटर के लिए एक बैश विशेष पर्याय है =, और जहाँ तक मैंने देखा है, वे सभी संदर्भों में बिल्कुल वैसा ही काम करते हैं।
हालांकि, ध्यान दें कि मैं विशेष रूप से के बारे में बात कर रहा हूँ =और ==या तो में इस्तेमाल किया स्ट्रिंग तुलना ऑपरेटरों [ ]या [[ ]]परीक्षण। मुझे लगता है कि सुझाव दे नहीं कर रहा हूँ =और ==परस्पर विनिमय कर रहे हर जगह बैश में।
उदाहरण के लिए, आप स्पष्ट रूप से चर असाइनमेंट नहीं कर सकते हैं ==, जैसे var=="foo"(तकनीकी रूप से आप ऐसा कर सकते हैं, लेकिन varइच्छा का मूल्य होगा "=foo", क्योंकि बैश एक ==ऑपरेटर नहीं देख रहा है, यह एक =(असाइनमेंट) ऑपरेटर देख रहा है , उसके बाद शाब्दिक मूल्य ="foo", जो बस बन जाता है "=foo")।
इसके अलावा, हालांकि =और ==विनिमेय हैं, आपको यह ध्यान रखना चाहिए कि उन परीक्षणों पर कैसे काम होता है यह इस बात पर निर्भर करता है कि आप इसे अंदर उपयोग कर रहे हैं [ ]या नहीं [[ ]], और यह भी कि ऑपरेंड उद्धृत हैं या नहीं। आप इसके बारे में अधिक उन्नत बैश स्क्रिप्टिंग गाइड में पढ़ सकते हैं : 7.3 अन्य तुलना ऑपरेटर (स्क्रॉल करें नीचे चर्चा =और ==)।
trueऔरfalseनीचे के अधिकांश स्निपेट के संदर्भ में सिर्फ सादे तार हैं, न किbash built-ins!!! कृपया नीचे माइक होल्ट का उत्तर पढ़ें। (यह एक उदाहरण है जहां एक अत्यधिक मतदान और स्वीकार किए गए उत्तर IMHO भ्रमित करने वाला है और कम मतदान वाले उत्तरों में व्यावहारिक सामग्री छाया है)