मैं द्वारा जवाब आप के बाद कर रहे हैं निहित है लगता है (यदि यह नहीं बताया) Vinko के जवाब है, हालांकि यह बस से बताया नहीं है। यह जानने के लिए कि VAR सेट है या खाली या सेट नहीं है, आप उपयोग कर सकते हैं:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
आप शायद दूसरी पंक्ति में दो परीक्षणों को एक साथ जोड़ सकते हैं:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
हालाँकि, यदि आप ऑटोकॉन्फ़ के लिए दस्तावेज़ीकरण पढ़ते हैं, तो आप पाएंगे कि वे ' -a
' के साथ शब्दों को संयोजित करने की अनुशंसा नहीं करते हैं और अलग-अलग परीक्षण परीक्षणों का उपयोग करने की अनुशंसा करते हैं&&
। मैंने एक ऐसी प्रणाली का सामना नहीं किया है जहाँ कोई समस्या है; इसका मतलब यह नहीं है कि वे अस्तित्व में नहीं थे (लेकिन वे शायद इन दिनों बहुत दुर्लभ हैं, भले ही वे सुदूर अतीत में उतने दुर्लभ न हों)।
आप बश नियमावली में इनका विवरण और अन्य संबंधित शेल पैरामीटर विस्तार , test
या[
कमांड और सशर्त अभिव्यक्ति पा सकते हैं ।
मुझे इस सवाल के जवाब के बारे में ईमेल द्वारा हाल ही में पूछा गया था:
आप दो परीक्षणों का उपयोग करते हैं, और मैं दूसरे को अच्छी तरह समझता हूं, लेकिन पहले वाले को नहीं। अधिक सटीक रूप से मैं चर विस्तार की आवश्यकता को नहीं समझता
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
क्या यह पूरा नहीं होगा?
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
निष्पक्ष प्रश्न - इसका उत्तर है 'नहीं, आपका सरल विकल्प एक ही काम नहीं करता है'।
मान लीजिए कि मैं आपके परीक्षण से पहले यह लिखता हूं:
VAR=
आपका परीक्षण यह कहेगा कि "VAR बिल्कुल सेट नहीं है", लेकिन मेरा कहना होगा (निहितार्थ से क्योंकि यह कुछ भी नहीं निकालता है) "VAR सेट है लेकिन इसका मान खाली हो सकता है"। इस स्क्रिप्ट का प्रयास करें:
(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo JL:1 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:1 VAR is not set at all; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo JL:2 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:2 VAR is not set at all; fi
)
आउटपुट है:
JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
परीक्षणों की दूसरी जोड़ी में, चर सेट किया गया है, लेकिन यह रिक्त मान पर सेट है। यही वह भेद है जिसे ${VAR=value}
और ${VAR:=value}
धारणाएँ बनाती हैं। Ditto के लिए , ${VAR-value}
और ${VAR:-value}
, ${VAR+value}
और ${VAR:+value}
, और इतने पर।
जैसा कि गिल्ली अपने जवाब में बताती है , यदि आप विकल्प के bash
साथ चलते हैं set -o nounset
, तो ऊपर दिया गया मूल उत्तर विफल हो जाता है unbound variable
। इसे आसानी से मिटा दिया जाता है:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
या आप (इसके समतुल्य होने के set -o nounset
साथ ) विकल्प को रद्द कर सकते हैं ।set +u
set -u
set -o nounset