जवाबों:
कुछ ऐतिहासिक गोले एक बहुत ही साधारण परसर को लागू करते हैं, जो उन चीजों से भ्रमित हो सकता है जैसे [ -n = "" ]
कि पहले =
ऑपरेटर ऑपरेटर की तरह दिखता है, और इसे [ -n = ]
सिंटैक्स त्रुटि के रूप में पार्स करेगा । उपसर्ग में [ "x$1" = x"" ]
, x
यह सुनिश्चित करता है कि x"$1"
संभवतः एक ऑपरेटर की तरह नहीं दिख सकता है, और इसलिए इस परीक्षण को खोल सकता है एकमात्र तरीका =
बाइनरी ऑपरेटर के रूप में माना जाता है ।
सभी आधुनिक गोले, और यहां तक कि सबसे पुराने गोले अभी भी संचालन में हैं, पोसिक्स नियमों का पालन करते हैं जो यह आदेश देते हैं कि 4 शब्दों तक के सभी परीक्षण अभिव्यक्तियों को सही ढंग से पार्स किया जाए। तो [ -z "$1" ]
परीक्षण के उचित तरीके से करता है, तो है $1
खाली है , और [ "$x" = "$y" ]
दो चर की समानता का परीक्षण करने के लिए एक उचित तरीका है।
यहां तक कि कुछ मौजूदा गोले लंबी अभिव्यक्ति के साथ भ्रमित हो सकते हैं, और कुछ भाव वास्तव में अस्पष्ट हैं, इसलिए लंबे बूलियन परीक्षणों के निर्माण के लिए -a
और -o
ऑपरेटरों के उपयोग से बचें , और इसके बजाय [
शेल के स्वयं &&
और ||
बूलियन ऑपरेटरों को अलग-अलग कॉल का उपयोग करें ।
[ -z "$1" ]
यदि $1
खाली है तो परीक्षण का एक उचित तरीका है । sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
- दोनों 0 पर वापस आते हैं, लेकिन दूसरे मामले में $1
खाली नहीं हो सकते क्योंकि यह मौजूद नहीं है।
Http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html के अनुसार , -z
परीक्षण कुछ कार्यान्वयनों में असुरक्षित है , संभवत: जब "दिलचस्प" तार "-o a=a"
का परीक्षण किया जाता है।
यदि आप "सेट -यू" या "सेट -ओ संज्ञा" के साथ चलते हैं, तो उपरोक्त परीक्षण भी एक त्रुटि का कारण बनेंगे।
एक खाली चर की जांच करने के लिए एक अधिक स्थिर तरीका पैरामीटर विस्तार का उपयोग करना होगा :
MYVAR = $ {MYVAR: - "खराब मान"}
यह विधि पारंपरिक बोर्न शेल के साथ-साथ ksh, और बैश के लिए भी काम करती है।
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
=
बनाम का उपयोग -z
कैसे करें, अब कैसे।
sh
वाणिज्यिक यूनियनों पर आधारित कुछ ksh88 अभी भी मुद्दा है। देखें यहाँ जानकारी के लिए।