2011-03-23 16 views
9

बैश का उपयोग करके, यह जांचने का सबसे अच्छा तरीका क्या है कि कोई चर खाली है या नहीं?बैश में अनसेट और खाली चर के बीच अंतर

अगर मैं का उपयोग करें:

if [ -z "$VAR" ] 

एक मंच यह एक सेट नहीं चर के लिए काम करता है में सुझाव दिया है, लेकिन यह सच है जब चर सेट, लेकिन खाली है के रूप में। सुझाव?

उत्तर

1
if [ `set | grep '^VAR=$'` ] 

इस स्ट्रिंग के लिए खोज करता "वीएआर =": आप या तो मामले के लिए परीक्षण करने के लिए इस का उपयोग कर सकते हैं।

+0

मुझे नहीं पता कि आपको किसने वोट दिया है, लेकिन आपका समाधान मेरे लिए काम करता है! – green69

+0

मैंने पहली बार गलत सवाल का जवाब दिया। यहां एक सही उत्तर दिया गया है। –

+1

मेरा डाउनवोट इसलिए है क्योंकि यह अनौपचारिक, बेकार और अक्षम है। खोल के लिए अंतर्निहित कार्यक्षमता है; इसके अतिरिक्त, आपके पास [बैकटिक्स का बेकार उपयोग] है (http://www.iki.fi/era/unix/award.html#backticks) और जाहिर है ['if' कथन क्या करता है इसकी अपूर्ण समझ।] (http://stackoverflow.com/questions/36371221/bash-if-statement-too-many-arguments/36371520#36371520) – tripleee

28

${var+set} परिवर्तनीय अनसेट होने पर set यदि कुछ खाली स्ट्रिंग समेत कुछ भी सेट किया गया है तो कुछ भी विकल्प नहीं है। ${var:+set} प्रतिस्थापन set केवल तभी परिवर्तनीय एक गैर-खाली स्ट्रिंग पर सेट है। सेट चर की सूची में

if [ "${foo+set}" = set ]; then 
    # set, but may be empty 
fi 

if [ "${foo:+set}" = set ]; then 
    # set and nonempty 
fi 

if [ "${foo-unset}" = unset ]; then 
    # foo not set or foo contains the actual string 'unset' 
    # to avoid a potential false condition in the latter case, 
    # use [ "${foo+set}" != set ] instead 
fi 

if [ "${foo:-unset}" = unset ]; then 
    # foo not set or foo empty or foo contains the actual string 'unset' 
fi 
+3

सिर्फ इस सवाल का जवाब आप जोड़ सकते हैं कि '-' विपरीत तरह काम करता है के दौर के लिए, यानी,' $ {foo- के बिना है अगर foo अनसेट हो तो अनसेट करें ''उपज' अनसेट करें। यह शुष्क चलने वाली स्क्रिप्ट के लिए उपयोगी है, उदा। 'rsync -avuz $ {DRYRUN --- सूखी दौड़} $ HOME/ब्लॉग/वेबसर्वर: ब्लॉग/'जिसे वास्तव में अपलोड करने के लिए' DRYRUN = upblog.sh' के रूप में चलाया जाना चाहिए। –

+1

यह स्वीकार्य उत्तर होना चाहिए। @ Jcomeau_ictx की उत्कृष्ट टिप्पणी शामिल करने के लिए संपादित उत्तर। – dev

0

अच्छी तरह से, यहाँ एक ही रास्ता है, तो चर सेट नहीं होने पर

$ s="" 
$ declare -p s 
declare -- s="" 
$ unset s 
$ declare -p s 
bash: declare: s: not found 

एक त्रुटि संदेश हो जाएगा है।

+0

मूल प्रश्न यह था कि वेरिएबल के बीच अंतर कैसे करें जो रिक्त स्ट्रिंग बनाम वेरिएबल्स पर सेट हैं जो बिल्कुल सेट नहीं हैं। यह दोनों मामलों के लिए खाली आता है। –

+0

हां, मैंने सवाल को गलत समझा। मेरा संपादन देखें। – kurumi

0

आप के साथ

[ -v name ]

नाम परीक्षण कर सकते हैं $ संकेत

+0

मैं इसे या तो बैश v3.2.57 (1) या v4.1.5 (1) में नहीं ढूंढ सकता। इसके लिए कौन सा खोल है? – tripleee

+0

मेरा बैश खोल संस्करण 4.3 है उबंटू 15.10 में। "सहायता परीक्षण" कमांड के साथ जांचें कि "-v" ऑपरेटर मौजूद है या नहीं। वास्तव में दो परीक्षण आदेश एक खोल निर्मित है और दूसरा/usr/bin/test है – mug896

संबंधित मुद्दे