मुझे लगता है कि Vinko के answer द्वारा उत्तर दिया गया है (अगर नहीं बताया गया है), हालांकि इसे आसानी से वर्तनी नहीं दी गई है। भेद करने के लिए वीएआर सेट है कि क्या है, लेकिन खाली है या नहीं निर्धारित करते हैं, आप का उपयोग कर सकते हैं:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
हालांकि, अगर आप पढ़ें:
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
आप शायद दो टेस्ट दूसरी पंक्ति पर एक में साथ गठजोड़ कर सकते हैं Autoconf के लिए प्रलेखन, आप पाएंगे कि वे '-a
' के साथ शर्तों को जोड़ने की अनुशंसा नहीं करते हैं और &&
के साथ संयुक्त अलग-अलग सरल परीक्षणों का उपयोग करने की अनुशंसा करते हैं। मुझे एक ऐसी प्रणाली का सामना नहीं हुआ है जहां कोई समस्या है; इसका मतलब यह नहीं है कि वे अस्तित्व में नहीं थे (लेकिन वे शायद इन दिनों बेहद दुर्लभ हैं, भले ही वे दूर के अतीत में दुर्लभ नहीं थे)।
आप बैश मैनुअल में इन विवरणों और अन्य संबंधित shell parameter expansions, test
or [
कमांड और conditional expressions का विवरण पा सकते हैं।
मैं हाल ही में प्रश्न के साथ इस उत्तर के बारे ईमेल द्वारा कहा गया था:
आप दो परीक्षणों का उपयोग, और मैं एक दूसरे को अच्छी तरह से नहीं, बल्कि पहले एक को समझते हैं। अधिक सटीक रूप से मुझे परिवर्तनीय विस्तार की आवश्यकता नहीं है
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=
आपका परीक्षण कहेंगे "वीएआर सब पर सेट है नहीं" है, लेकिन (क्योंकि यह कुछ भी नहीं गूँज निहितार्थ से) मेरा कहेंगे "वीएआर सेट कर दिया जाता है, लेकिन इसके मूल्य खाली हो सकता है "। इस स्क्रिप्ट का प्रयास करें:
(
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}
नोटेशन बनाते हैं। ${VAR-value}
और ${VAR:-value}
, और ${VAR+value}
और ${VAR:+value}
, और इसी तरह के लिए Ditto।
Gili के रूप में उसकी answer में बताते हैं, अगर आप set -o nounset
विकल्प के साथ bash
चलाने के लिए, तो बुनियादी जवाब ऊपर 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 +u
(set -u
set -o nounset
के बराबर किया जा रहा है) के साथ set -o nounset
विकल्प को रद्द कर सकता है।
कृपया [-z "$ mystr"] के रूप में करने का विरोध किया का उपयोग कर की आदत में हो [-z $ mystr] –
कैसे उलटा बात करना है? मेरा मतलब है जब स्ट्रिंग शून्य – flow
@flow नहीं है: क्या बारे में '[-n" $ {वीएआर + x} "] && गूंज – Lekensteyn