शेल स्क्रिप्ट में एक वेरिएबल खाली होने पर परीक्षण करना


27

मैंने निम्न तकनीक को कई अलग-अलग गोले पर कई बार इस्तेमाल किया है, यह परखने के लिए कि क्या एक चर खाली है:

if [ "x$1" = "x" ]; then 
    # Variable is empty
fi

क्या अधिक विहित पर इस का उपयोग करने पर कोई लाभ है if [ -z "$1" ]? क्या यह पोर्टेबिलिटी का मुद्दा हो सकता है?

जवाबों:


17

कुछ ऐतिहासिक गोले एक बहुत ही साधारण परसर को लागू करते हैं, जो उन चीजों से भ्रमित हो सकता है जैसे [ -n = "" ]कि पहले =ऑपरेटर ऑपरेटर की तरह दिखता है, और इसे [ -n = ]सिंटैक्स त्रुटि के रूप में पार्स करेगा । उपसर्ग में [ "x$1" = x"" ], xयह सुनिश्चित करता है कि x"$1"संभवतः एक ऑपरेटर की तरह नहीं दिख सकता है, और इसलिए इस परीक्षण को खोल सकता है एकमात्र तरीका =बाइनरी ऑपरेटर के रूप में माना जाता है ।

सभी आधुनिक गोले, और यहां तक ​​कि सबसे पुराने गोले अभी भी संचालन में हैं, पोसिक्स नियमों का पालन करते हैं जो यह आदेश देते हैं कि 4 शब्दों तक के सभी परीक्षण अभिव्यक्तियों को सही ढंग से पार्स किया जाए। तो [ -z "$1" ]परीक्षण के उचित तरीके से करता है, तो है $1खाली है , और [ "$x" = "$y" ]दो चर की समानता का परीक्षण करने के लिए एक उचित तरीका है।

यहां तक ​​कि कुछ मौजूदा गोले लंबी अभिव्यक्ति के साथ भ्रमित हो सकते हैं, और कुछ भाव वास्तव में अस्पष्ट हैं, इसलिए लंबे बूलियन परीक्षणों के निर्माण के लिए -aऔर -oऑपरेटरों के उपयोग से बचें , और इसके बजाय [शेल के स्वयं &&और ||बूलियन ऑपरेटरों को अलग-अलग कॉल का उपयोग करें ।


3
यह केवल ऐतिहासिक गोले नहीं हैं। कुछ shवाणिज्यिक यूनियनों पर आधारित कुछ ksh88 अभी भी मुद्दा है। देखें यहाँ जानकारी के लिए।
— स्टीफन चेज़लस 21

यह कथन गलत है: [ -z "$1" ]यदि $1खाली है तो परीक्षण का एक उचित तरीका है । sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'- दोनों 0 पर वापस आते हैं, लेकिन दूसरे मामले में $1खाली नहीं हो सकते क्योंकि यह मौजूद नहीं है।
— 15


3

यदि आप "सेट -यू" या "सेट -ओ संज्ञा" के साथ चलते हैं, तो उपरोक्त परीक्षण भी एक त्रुटि का कारण बनेंगे।

एक खाली चर की जांच करने के लिए एक अधिक स्थिर तरीका पैरामीटर विस्तार का उपयोग करना होगा :

MYVAR = $ {MYVAR: - "खराब मान"}

यह विधि पारंपरिक बोर्न शेल के साथ-साथ ksh, और बैश के लिए भी काम करती है।


2
मेरा मानना ​​है कि यह इस प्रकार लिखा गया है -> M = $ {M: - "खराब मान"}
— ज्ञान

0
    function isBlank {
 valueNoSpaces=$(echo "$@" | tr -d ' ')

 if [  "$valueNoSpaces" == null ] || [ -z "$valueNoSpaces" ] 
 then
       echo true ;
 else
       echo ""  ;
 fi
}

#Test
if [ $(isBlank "      ") ] 
then
    echo "isBlank \"      \" : it's blank"
else
    echo " isBlank \"      \": it is not blank"
fi

if [ $(isBlank "abc") ] 

then
    echo "isBlank \"abc\" : it's blank"
else
    echo "isBlank \"abc\" :it is not blank"
fi

if [ $(isBlank null) ] 
then
      echo "isBlank null : it's blank"
else
    echo "isBlank null : it is not blank"
fi

if [ $(isBlank "") ] 
then
    echo "isBlank \"\" : it's blank"
else
    echo "isBlank \"\" : it is not blank"
fi

#Result
isBlank "      " : it's blank

isBlank "abc" :it is not blank

isBlank null : it's blank

isBlank "" : it's blank

3
नमस्ते! मुझे यकीन नहीं है कि यह सवाल का जवाब कैसे देता है, जो पूछता है कि= बनाम का उपयोग -zकैसे करें, अब कैसे।
— धग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.