शेल स्क्रिप्ट में एक वैरिएबल "यदि" कथन को उद्धृत करें


9

जैसे

if [ "$FOO" = "true" ]; then

बनाम

if [ $FOO = "true" ]; then

अलग क्या है? लगता है दोनों के दो कथन भी काम करते हैं।


बैश में, डबल वर्ग ब्रैकेट का उपयोग करें और आपको उद्धरण चिह्नों की आवश्यकता नहीं है और आपको अतिरिक्त लाभ मिलेगा ।
अगली सूचना तक रोक दिया गया।

@ डेनिस विलियम्सन काफी नहीं है, आपको समानता (इन) समानता और पैटर्न मिलान ऑपरेटरों के दाहिने हाथ की ओर उद्धरण की आवश्यकता है।
गिलेस एसओ- बुराई को रोकना '


@ गिल्स: कभी-कभी नहीं। रिक्त स्थान वाले शाब्दिक तार के लिए या शाब्दिक तार या चर जिसमें ग्लोब वर्ण होते हैं, जिन्हें आप शाब्दिक रूप से लिया जाना चाहते हैं , सही पक्ष को उद्धृत किया जाना चाहिए a='foo bar'; [[ $a == "foo bar" ]]:। हालांकि, एक चर जिसमें ग्लोब वर्ण नहीं होते हैं: की आवश्यकता नहीं है [[ $a == $a ]]। डबल स्क्वायर ब्रैकेट के अंदर शब्द विस्तार नहीं किया जाता है। और रेगेक्स मिलान के लिए, दाहिने हाथ की ओर के पैटर्न को उद्धृत नहीं किया जाना चाहिए या इसे शाब्दिक स्ट्रिंग के रूप में लिया जाएगा: [[ $a =~ .*oo.*r ]](पैटर्न को अन-कोटेड चर में होना चाहिए, हालांकि, इसके बजाय ...
आगे की सूचना तक रोका गया।

शाब्दिक रूप से यहाँ के रूप में शामिल किया जा रहा है)। ग्लोब-शैली पैटर्न मिलान के लिए, ग्लोब वर्णों को उद्धृत नहीं किया जाना चाहिए, चाहे वह शाब्दिक हो या किसी चर में [[ $a == foo* ]]:। क्या आप मेरे शाब्दिक स्ट्रिंग उदाहरण के अलावा उद्धृत करने के लिए आवश्यकता का कोई अतिरिक्त उदाहरण प्रदान कर सकते हैं?
अगली सूचना तक रोक दिया गया।

जवाबों:


6

यदि मान $FOOएक एकल शब्द है जिसमें वाइल्डकार्ड वर्ण नहीं है \[*?, तो दोनों समान हैं।

यदि $FOOअनसाइन किया गया है, या खाली है, या एक से अधिक शब्द (यानी, व्हॉट्सएप या $IFS) शामिल है, तो अनक्वॉटेड संस्करण एक सिंटैक्स त्रुटि है। यदि ऐसा होता है तो केवल शब्दों का सही क्रम (जैसे 0 -eq 0 -o false), परिणाम मनमाना हो सकता है। इसलिए, शेल स्क्रिप्ट में हमेशा चर को उद्धृत करना अच्छा अभ्यास है।

संयोग से, "true"उद्धृत करने की आवश्यकता नहीं है।


3

यह समझने के लिए कि यह किन समस्याओं का कारण हो सकता है, यहाँ कुछ उदाहरण हैं।

मान लें कि हमारे पास दो चर हैं:

FOO="some value"
BAR="some value"

अब हमारे पास दो वेरिएबल्स हैं, जो बिल्कुल समान स्ट्रिंग / मान रखते हैं। यदि हमने कुछ किया तो परिणाम का परीक्षण करने के लिए, आपके मामले में:

if [ $FOO = "$BAR" ]; then echo "match"; else echo "no match"; fi

इस बिंदु पर आप प्राप्त करेंगे bash: [: too many arguments। निर्विवाद $ FOO अब तीन मान रखता है, अर्थात् '[ , some , value'[परीक्षण कीवर्ड को पता नहीं है कि क्या निष्पादित करना है क्योंकि यह ऑपरेटर होने के पहले या दूसरे तर्क की उम्मीद कर रहा है।

जब हम "$ FOO" उद्धृत करते हैं, तो हम स्पष्ट ifरूप से उन सही मूल्यों को देखने के लिए कहते हैं, जहाँ कोई शब्द विभाजन नहीं होता है।

एक और उदाहरण:

my_file="A random file.txt"
  • करने का rm $my_fileअर्थ है 'ए' 'रैंडम' 'फाइल' टेक्स्ट को हटाना जो इसे तीन फाइल बनाता है।
  • कर rm "$my_file""एक यादृच्छिक file.txt" जो एक फाइल बनाता निकाल देंगे।

आशा है कि मैंने आपको इन उदाहरणों से भ्रमित नहीं किया है।


0

इस विशिष्ट मामले में कोई अंतर नहीं है।

हालाँकि, यदि $FOOकोई स्थान या कुछ विशेष वर्ण हैं, तो आपको कोई समस्या होगी।

में "$FOO"मामला है, यह कुल में चर का उपयोग करेगा, मैच अंतरिक्ष समस्या से आप इंसुलेटिंग बनाने के लिए।

हालाँकि, यदि आप उपयोग करते हैं $FOOऔर एक विशेष मामला है, तो यह कथन को प्रभावित करेगा।

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