बैश में, यदि [-z "$ 1"] और यदि ["$ 1" = ""] समान हैं?


28

बैश शेल स्क्रिप्टिंग में, निम्नलिखित दो कथनों के बीच अंतर (यदि कोई हो) क्या है?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

मैंने खुद को कुछ स्क्रिप्ट्स में दूसरा लिखने के लिए पाया है, लेकिन फिर मैंने यहाँ पढ़ा कि -zउसी चीज़ को हासिल करने से।

यदि दूसरे का उपयोग करने में समस्याएं हैं, तो क्या हमें अनदेखा करना चाहिए कि पहले वाला थोड़ा बेहतर दिखता है?


3
एक विस्तृत तुलना के लिए, स्टैक ओवरफ्लो पर मेरा जवाब देखें । इसके अलावा, यह और यह देखें ।
अगली सूचना तक रोक दिया गया।

कुछ अच्छे उत्तरों के साथ अच्छे लिंक :)
जोहान

जवाबों:


36

[ "$1" = "" ]और [ -z "$1" ]बाश और अन्य POSIX- आज्ञाकारी गोले में बिल्कुल समान हैं। (ध्यान दें कि कोष्ठक के प्रत्येक तरफ एक स्थान होना चाहिए, जब तक कि एक गैर-शब्द-घटक चरित्र न हो ;।)

[कोई अन्य की तरह निर्मित शेल है; वास्तव में इसे वर्तनी भी कहा जा सकता है test(दोनों के बीच एकमात्र अंतर यह है कि अंतिम तर्क के रूप में [आवश्यक है ])। तो अगर आप को चलाने के [ "$1" = "" ]साथ $1करने के लिए विस्तार हो -z:, परीक्षण ऑपरेटर तीन तर्कों को देखता है -z, =और खाली स्ट्रिंग। कुछ पुराने बॉर्न शेल ने कभी-कभी पार्स त्रुटियों को फेंक दिया जब एक ऑपरेटर इस तरह से एक ऑपरेटर की तरह दिखता था, भले ही पूर्ण अभिव्यक्ति में कोई अस्पष्टता न हो। मुझे नहीं पता कि किसी भी संस्करण ने वास्तव में इस विशेष अभिव्यक्ति के साथ परेशानी की है, लेकिन अधिक जटिल अभिव्यक्तियां उन्हें फेंक सकती हैं। ऐसे संस्करण भी हो सकते हैं जिन्हें खाली शब्दों से परेशानी थी; ये भी समर्थन नहीं किया होगा [ -z "$1" ]। एक सामान्य शैल मुहावरा है[ x"$1" = x"" ]। यह ऑपरेटर के रूप में संचालित ऑपरेंड होने के किसी भी जोखिम से बचता है क्योंकि कोई भी ऑपरेटर एक पत्र से शुरू नहीं होता है।

Ksh, बैश और zsh में, आप, डबल ब्रैकेट सिंटैक्स का उपयोग कर सकते हैं [[ -z $1 ]]। यह नया सिंटैक्स (यह 1970 के दशक के उत्तरार्ध के अंत से 1980 के दशक का है) एक साधारण अंतर्निर्मित के बजाय एक विशेष सिंटैक्टिक निर्माण का उपयोग करके ऑपरेटर्स के रूप में संचालित होने के जोखिम को समाप्त करता है। ऑपरेटरों को शाब्दिक रूप से प्रकट होना चाहिए, डबल कोष्ठक के भीतर निर्विवाद, और आपको दोहरे चर चर विस्तार की आवश्यकता नहीं है।


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