सभी POSIX गोले के लिए पोर्टेबल:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
यह सुनिश्चित करें कि ${foobar:+1}
यदि आप foobar
उसी तरह से व्यवहार करना चाहते हैं चाहे वह खाली हो या परिभाषित नहीं हो। अपरिभाषित ${foobar-}
होने पर आप एक रिक्त स्ट्रिंग प्राप्त करने के लिए उपयोग कर सकते हैं foobar
और foobar
अन्यथा के मूल्य (या उसके बाद कोई अन्य डिफ़ॉल्ट मान डाल सकते हैं -
)।
Ksh में, यदि foobar
घोषित किया गया है, लेकिन परिभाषित नहीं है, जैसा कि है typeset -a foobar
, तो ${foobar+1}
खाली स्ट्रिंग में फैलता है।
Zsh में वैरिएबल नहीं हैं जो घोषित हैं, लेकिन सेट नहीं हैं: typeset -a foobar
एक खाली सरणी बनाता है।
बैश में, सरणियाँ एक अलग और आश्चर्यजनक तरीके से व्यवहार करती हैं। ${a+1}
केवल 1
अगर a
एक गैर-खाली सरणी है, उदाहरण के लिए
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
एक ही सिद्धांत साहचर्य सरणियों पर लागू होता है: सरणी चर को परिभाषित किया जाता है यदि उनके पास सूचकांकों का एक गैर-खाली सेट है।
परीक्षण का एक अलग, बाश-विशिष्ट तरीका है कि क्या किसी भी प्रकार के एक चर को परिभाषित किया गया है, यह जांचने के लिए है कि क्या यह सूचीबद्ध है । यह खाली सरणियों को परिभाषित करता है, इसके विपरीत , लेकिन घोषित-लेकिन-अप्रमाणित चर ( ) को अपरिभाषित के रूप में रिपोर्ट करता है।${!PREFIX*}
${foobar+1}
unset foobar; typeset -a foobar
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
इस के बराबर है की वापसी मूल्य का परीक्षण typeset -p foobar
याdeclare -p foobar
, सिवाय इसके कि typeset -p foobar
घोषित बल्कि असाइन नहीं किए गए चर पर विफल रहता है।
बश में, ksh की तरह, set -o nounset; typeset -a foobar; echo $foobar
अपरिभाषित चर का विस्तार करने के प्रयास में एक त्रुटि को ट्रिगर करता है foobar
। Ksh के विपरीत, set -o nounset; foobar=(); echo $foobar
(या echo "${foobar[@]}"
) भी एक त्रुटि को ट्रिगर करता है।
ध्यान दें कि यहां वर्णित सभी स्थितियों में, ${foobar+1}
खाली स्ट्रिंग का विस्तार होता है यदि और केवल तभी यदि $foobar
कोई त्रुटि होती है set -o nounset
।
-v
एक विकल्प नहीं हैtest
, लेकिन सशर्त अभिव्यक्तियों के लिए एक ऑपरेटर है।