2012-07-27 18 views
29

मैं एक शेल स्क्रिप्ट लिख रहा हूं, जहां मुझे यह जांचना है कि क्या पर्यावरण परिवर्तनीय सेट है, अगर सेट नहीं है तो मुझे इसे सेट करना होगा। क्या शैल स्क्रिप्ट में जांच करने का कोई तरीका है, चाहे पर्यावरण चर पहले से सेट हो या नहीं?जांचें कि क्या पर्यावरण चर पहले से सेट है

+0

दरअसल, यह उस प्रश्न का सही डुप्लिकेट नहीं है: ओपी यहां जानना चाहता है कि एक चर सेट किया गया था, और यदि कोई स्क्रिप्ट छोड़ने के बजाय इसके बारे में कुछ नहीं करता है। $ {V :?} उस मामले में एक वैध उत्तर नहीं है। 'सेट | grep -q '^ वी =' 'है। वैरिएबल की उपस्थिति के लिए यह परीक्षण और वर्क्स सेट किए जाने पर भी खाली स्ट्रिंग पर काम करता है। – Coroos

उत्तर

27
[ -z "$VARIABLE" ] && VARIABLE="abc" 

if env | grep -q ^VARIABLE= 
then 
    echo env variable is already exported 
else 
    echo env variable was not exported, but now it is 
    export VARIABLE 
fi 

मैं जोर देना कि [ -z $VARIABLE ] पर्याप्त नहीं है, क्योंकि आप VARIABLE हो सकता है चाहते हैं, लेकिन यह निर्यात नहीं किया गया था। इसका मतलब है कि यह एक पर्यावरण चर नहीं है।

+0

क्या यह सभी शैल पर्यावरण में काम करेगा? – Mojoy

+0

@ सेंथिलनाथन: हां, ज़ाहिर है, केवल एक चीज जिसे इस मोर कोड को अधिक पोर्टेबल बनाने के लिए फिर से लिखा जा सकता है, वह 'grep -q' है। कोई 'एनवी | लिख सकता है grep^VARIABLE =>/dev/null' इसके बजाए। –

+0

यदि मैं एक चर निर्यात करता हूं, तो इसे निर्यात किए बिना वैरिएबल को किसी अन्य चीज़ पर सेट करें, क्या मैं अपने गैर-निर्यात किए गए चर और मेरे निर्यात किए गए चर के बीच मेल नहीं खाता हूं, या यह स्वचालित रूप से निर्यात किए गए अपडेट को अपडेट भी करेगा? – ArtOfWarfare

7
if [ -z "$VARIABLE" ]; then 
    VARIABLE=... 
fi 

यह जांचता है कि $ VARIABLE की लंबाई शून्य है या नहीं।

13

क्या आप क्या करना चाहते बैश में देशी है, यह कहा जाता है पैरामीटर प्रतिस्थापन:

VARIABLE="${VARIABLE:=abc}" 

चर सेट नहीं है, तो दाहिने हाथ की ओर एबीसी के बराबर हो जाएगा। ध्यान दें कि आंतरिक ऑपरेटर: = को प्रतिस्थापित किया जा सकता है: - यदि परीक्षण किया जाता है तो VARIABLE सेट या खाली नहीं है।

+0

बिल्कुल वही जो मैं खोज रहा था। लाइन 'निर्यात TEST_DATABASE_NAME =" $ {TEST_DATABASE_NAME: = prodlike} "' TEST_DATABASE_NAME को पहले से परिभाषित नहीं किया गया था, तो केवल डिफ़ॉल्ट के रूप में प्रोड्लिक जैसा ही उपयोग करेगा। कोई गन्दा सशर्त ब्लॉक नहीं। सभी कोड की एक पंक्ति में। –

46

मानक समाधान सशर्त एक चर आवंटित करने के लिए (वातावरण में है या नहीं) है:

: ${VAR=foo} 

कि मूल्य "foo" केवल अगर यह सेट नहीं होने के लिए वीएआर सेट हो जाएगा।
वीएआर को "foo" सेट करने के लिए करता है, तो वीएआर सेट नहीं है या खाली स्ट्रिंग, इस्तेमाल होता है:

: ${VAR:=foo} 

वातावरण में वीएआर में कहें, साथ पालन करें:

export VAR 

तुम भी कर सकते हैं export VAR=${VAR-foo} या export VAR=${VAR:=foo}, लेकिन कुछ पुराने गोले एक ही पंक्ति में असाइनमेंट और निर्यात के सिंटैक्स का समर्थन नहीं करते हैं। इसके अलावा, DRY; = ऑपरेटर के दोनों किनारों पर नाम का उपयोग अनावश्यक पुनरावृत्ति है। (चर का निर्यात करने वाली दूसरी पंक्ति एक ही प्रिंसिपल का उल्लंघन करती है, लेकिन बेहतर महसूस करती है।)

ध्यान दें कि सामान्य रूप से यह निर्धारित करना बहुत मुश्किल है कि वातावरण में कोई चर है या नहीं। env के आउटपुट को पार्स करना काम नहीं करेगा। पर विचार करें:

export foo=' 
VAR=var-value' 
env | grep VAR 

न ही यह एक subshell और परीक्षण अंडे देने के लिए काम करता है:

sh -c 'echo $VAR' 

कि वीएआर का संकेत होगा subshell में सेट कर दिया जाता है, जो एक संकेत है कि वीएआर के वातावरण में है हो सकता है वर्तमान प्रक्रिया, लेकिन यह बस हो सकता है कि VAR को सबहेल के प्रारंभ में सेट किया गया हो। कार्यात्मक रूप से, हालांकि, परिणाम वही है जैसे वीएआर पर्यावरण में है। सौभाग्य से, आप आमतौर पर परवाह नहीं करते हैं कि वीएआर पर्यावरण में है या नहीं। यदि आपको वहां इसकी ज़रूरत है, तो उसे वहां रखें। यदि आपको इसकी ज़रूरत है, तो इसे बाहर निकालें।

+0

क्या आप '$ {VAR: = foo}' नोटेशन आंतरिक रूप से कैसे काम करते हैं, इस बारे में एक स्पष्टीकरण जोड़ सकते हैं? मैं हमेशा इसे समाधान के रूप में पाता हूं लेकिन वास्तव में यह वास्तव में कैसे काम करता है। –

+1

मुझे [StackOverflow] पर कुछ स्पष्टीकरण मिला (http://stackoverflow.com/questions/4437573/bash-assign-default-value)! –

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