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


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.