2013-10-30 16 views
6

मैं अपने विकास वर्कफ़्लो को व्यवस्थित करने के लिए एक शेल स्क्रिप्ट लिख रहा हूं।मुझे 'यूनरी ऑपरेटर अपेक्षित' त्रुटि क्यों मिल रही है?

यह तर्क देता है कि मैं किस विषय फ़ोल्डर में काम करने जा रहा हूं और उस निर्देशिका पर grunt watch शुरू करता हूं।

यदि मैं आवश्यक तर्क के बिना स्क्रिप्ट को कॉल करता हूं तो मैं वर्तमान में एक चेतावनी प्रिंट कर रहा हूं कि थीम को कमांड लाइन तर्क के रूप में निर्दिष्ट करने की आवश्यकता है।

मैं उपलब्ध विकल्पों की एक सूची मुद्रित करना चाहता हूं, उदा। विषय निर्देशिका

यह वही है मैं अब तक किया है ...

THEME=$1 

if [ $THEME == '' ] 
then 
    echo 'Need to specify theme' 
else 
    cd 'workspace/aws/ghost/'$THEME'/' 
    grunt watch 
fi 

आदर्श रूप में मैं इतना

THEME=$1 

if [ $THEME == '' ] 
then 
    echo 'Need to specify theme from the following' 
    ls workspace/aws/ghost 
else 
    cd 'workspace/aws/ghost/'$THEME'/' 
    grunt watch 
fi 
तरह विषयों मूल निर्देशिका का एक ls साथ echo लाइन के उत्पादन की जगह होगी

हालांकि यह मेरे निम्नलिखित त्रुटि देता है

./ghost_dev.sh: line 3: [: ==: unary operator expected 
+1

खाली रिक्त स्थान की जांच के लिए आपको '-z' का उपयोग करना चाहिए: 'अगर [-z" $ थीम "]'। – Kevin

+0

शीर्षक संपादित किया गया, मैं '-z' – Luke

+0

' के साथ प्रयास करूंगा यदि [[-z "$ THEME"]] 'पूरी तरह से काम करता है - धन्यवाद। – Luke

उत्तर

23

,

if [ $THEME == '' ] 

अन्यथा जब आप एक विषय का उल्लेख नहीं करते, $THEME कुछ भी नहीं करने के लिए फैलता है, और खोल इस सिंटैक्स त्रुटि देखता है:: आप चारों ओर $THEME यहाँ उद्धरण की जरूरत

if [ == '' ] 

उद्धरण के साथ की तरह, जोड़ा इसलिए:

if [ "$THEME" == '' ] 

एक खाली $THEME के विस्तार के इस वैध तुलना पैदावार बजाय:

if [ "" == '' ] 

क्रम वाक्यविन्यास त्रुटियों के लिए यह क्षमता जिनकी पृष्ठभूमि और अधिक परंपरागत प्रोग्रामिंग भाषाओं में है करने के लिए आश्चर्य की बात हो सकती है, लेकिन आदेश के गोले (कम से कम बॉर्न परंपरा में उन) कुछ अलग कोड पार्स। कई संदर्भों में, शैल पैरामीटर वैरिएबल की तुलना में मैक्रोज़ की तरह व्यवहार करते हैं; यह व्यवहार लचीलापन प्रदान करता है, लेकिन अनचाहे के लिए जाल भी बनाता है।

जब से तुम इस सवाल बैश टैग किए गए, यह ध्यान देने योग्य है कि वहाँ कोई शब्द-बंटवारे 'नई' परीक्षण वाक्य रचना बैश (और ksh/zsh) में उपलब्ध अंदर पैरामीटर विस्तार का परिणाम पर प्रदर्शन किया, अर्थात् [[ लायक है। .. ]]। तो अगर आप भी ऐसा कर सकते हैं:

if [[ $THEME == '' ]] 

स्थानों आप दूर उद्धरण चिह्नों के बिना प्राप्त कर सकते हैं here सूचीबद्ध हैं। लेकिन जब भी आप स्पष्ट रूप से शब्द-विभाजन चाहते हैं, तब भी पैरामीटर विस्तार को उद्धृत करने की एक अच्छी आदत है (और फिर भी, यह देखने के लिए कि क्या ऐरे आपकी समस्या को हल करेंगे या नहीं)।

यह अधिक रिक्त स्ट्रिंग के साथ समानता के बजाय -z परीक्षण ऑपरेटर का उपयोग करने के मुहावरेदार होगा:

if [ -z "$THEME" ] 

आप तकनीकी रूप से इस सरल मामले में उद्धरण चिह्नों जरूरत नहीं है, [ -z ] सच का मूल्यांकन करता है। लेकिन यदि आपके पास अधिक जटिल अभिव्यक्ति है, तो पार्सर उलझन में आ जाएगा, इसलिए हमेशा उद्धरणों का उपयोग करना बेहतर होता है। बेशक, [[ ... ]] उद्धरण यहाँ की आवश्यकता नहीं है, या तो:

if [[ -z $THEME ]] 

लेकिन [[ ... ]] POSIX मानक का हिस्सा नहीं है; उस मामले के लिए, न तो == है। इसलिए यदि आप अन्य POSIX शैल के साथ सख्त संगतता की परवाह करते हैं, तो उद्धरण समाधान से चिपके रहें और -z या एक = का उपयोग करें।

+0

ठीक है, मैंने चर असाइनमेंट के चारों ओर उद्धरण जोड़े हैं, [[]] वाक्यविन्यास का उपयोग किया है और सर्वोत्तम प्रथाओं के लिए "$ THEME" पर उद्धरण जोड़े हैं। एक इलाज करता है! धन्यवाद। – Luke

+3

असाइनमेंट थोड़ा अलग काम करते हैं; कम से कम शब्द विभाजन आरएचएस पर नहीं होता है, इसलिए मुझे लगता है कि 'थीम = "$ 1" 'और' थीम = $ 1' समान हैं, हालांकि मुझे भूलने के कोने के मामले में सुधार करना अच्छा लगेगा। – chepner

+0

@chepner - आप सही हैं, किसी असाइनमेंट के दाईं ओर विस्तार के आस-पास उद्धरणों की आवश्यकता नहीं है। अभी भी किसी भी शाब्दिक सफेद जगह उद्धृत करने की जरूरत है। –

0

कृपया डबल कोट्स के साथ वाक्यविन्यास को सही करें।

if [ "$THEME" == "" ] then 
    echo 'Need to specify theme from the following' 
    ls workspace/aws/ghost 
2

[ "$THEME" ] गलत पर मूल्यांकन करेंगे अगर $THEME अन्यथा अपरिभाषित या कोई रिक्त स्ट्रिंग और सच है। http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html#Bash-Conditional-Expressions देखें। आप अपने अगर बयान इस व्यवहार का दोहन करने के लिए पुनर्व्यवस्थित कर सकते हैं और है एक भी सरल सशर्त:

 
if [ "$THEME" ]; then 
    cd 'workspace/aws/ghost/'$THEME'/' 
    grunt watch 
else 
    echo 'Need to specify theme from the following' 
    ls workspace/aws/ghost 
fi 

"$THEME" जरूरतों, डबल उद्धरण में होने की स्थिति में अपने मूल्य रिक्त स्थान हैं।

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