2012-05-14 15 views
12

में मेरी बैश स्क्रिप्ट में "यूनरी ऑपरेटर अपेक्षित" मुठभेड़ है, मेरे पास बाद में मुख्य फ़ंक्शन की स्थिति के लिए 0 या 1 (सत्य या गलत) वापस करने के लिए एक फ़ंक्शन है।बैश स्क्रिप्ट

function1() { 
    if [[ "${1}" =~ "^ ...some regexp... $" ]] ; then 
     return 1 
    else 
     return 0 
    fi 
} 

तो मेरा मुख्य समारोह में:

किसी को भी मदद कर सकते हैं

main() { 
    for arg in ${@} ; do 
     if [ function1 ${arg} ] ; then 
      ... 
     elif [ ... ] ; then 
      ... 
     fi 
    done 
} 

तथापि, जब मैं इस स्क्रिप्ट चलाने पर यह मुझे हमेशा एक त्रुटि संदेश ": function1 एकल ऑपरेटर की उम्मीद [" दिया कृपया मुझे?

+1

ध्यान दें कि कम से कम बैश संस्करण 4 में, आपको नियमित अभिव्यक्ति उद्धृत नहीं करना चाहिए : ऐसा करने से सरल स्ट्रिंग मिलान को मजबूर किया जाता है - [यहां दस्तावेज] (http://www.gnu.org/software/bash/manual/bashref.html#index-g_t_005b_005b-57)। साथ ही, आपको 'तर्क के लिए' $ @ "' उद्धरण के साथ, या तर्क के लिए सरल 'का उपयोग करना चाहिए; करें ... ' –

+1

आपको अपने रेगेक्स को एक चर में रखना चाहिए। 'पैटर्न = '^ ... कुछ regexp ... $'; अगर [[$ 1 = ~ $ पैटर्न]] '। ध्यान दें कि डबल स्क्वायर ब्रैकेट के अंदर, चर को उद्धृत करना आवश्यक नहीं है और जैसा कि ग्लेन ने कहा है, रेगेक्स (चर) को कभी उद्धृत नहीं किया जाना चाहिए। –

उत्तर

28

आप यह मानने की सामान्य गलती कर रहे हैं कि [if कमांड के सिंटैक्स का हिस्सा है। यह नहीं; if की वाक्य रचना बस

if command; then 
    ... things which should happen if command's result code was 0 
else 
    ... things which should happen otherwise 
fi 

आम command रों उपयोग हम में से एक [ जो आदेश test के लिए एक उपनाम है है। स्ट्रिंग्स, संख्याओं और फ़ाइलों की तुलना करने के लिए यह एक साधारण आदेश है। यह तर्कों का एक काफी संकीर्ण संयोजन स्वीकार करता है, और अगर आप अपेक्षित तर्कों को पारित नहीं करते हैं तो भ्रमित और भ्रामक त्रुटि संदेशों को उत्पन्न करते हैं। (या इसके बजाए, जब आप इसका उपयोग नहीं करते हैं तो त्रुटि संदेश पर्याप्त और सहायक होते हैं, लेकिन यदि आप उपयोग नहीं किए जाते हैं तो उन्हें आसानी से गलत समझा जाता है।)

आपके main फ़ंक्शन में, [ पर कॉल गलत स्थान पर दिखाई देता है। आप शायद

if function "$arg"; then 
    ... 
elif ... ; then ... 

वैसे, अच्छी माप के लिए, आपको हमेशा अपने तारों को उद्धृत करना चाहिए। के बजाय "$1"$1, और "$arg" का उपयोग करें।

test के लिए ऐतिहासिक कारणों के सामान के सामान्य रसोई सिंक के रूप में लेखकों ने if के सिंटैक्स का हिस्सा नहीं बनाना चाहते थे, मूल बोर्न शैल के कम आकर्षक डिजाइनों में से एक है। बैश और zsh विकल्प कम पेशकश करते हैं ([[ बैश में डबल ब्रैकेट्स, जो आप अपने function1 परिभाषा में उपयोग करते हैं), और निश्चित रूप से, POSIX test बेल लैब्स से मूल निर्माण की तुलना में बहुत अधिक स्वभावपूर्ण है।

एक अतिरिक्त स्पष्टीकरण के रूप में, अपने कार्य अभी

function1() { 
    ! [[ "$1" =~ "^ ...some regexp... $" ]] 
} 

है, [[ साथ परीक्षण करने और उसके परिणाम कोड उल्टा करने के लिए सरल किया जा सकता। ("सामान्य" मामला सफलता के लिए 0 वापस करना होगा, लेकिन हो सकता है कि आप यह सत्यापित करने का प्रयास कर रहे हैं कि स्ट्रिंग मेल नहीं खाती है?)

+0

वे ... $ {1} के बाद स्क्रिप्ट का प्रतिनिधित्व करते हैं, और मेरी वास्तविक लिपि में मैं सावधानीपूर्वक एक स्क्रिप्ट के साथ अपनी स्क्रिप्ट और ब्रैकेट को विभाजित करता हूं। तो मुझे नहीं लगता कि यह –

+0

संख्या के साथ समस्या है, मेरा फ़ंक्शन 1 वास्तव में जांचता है कि वह $ 1 किसी प्रकार की नियमित अभिव्यक्ति से मेल खाता है या नहीं।और मेरा कार्य 1 सिर्फ ठीक खड़े काम करता है। तो मुझे क्या लगता है कि मेरे मुख्य समारोह –

+0

में स्थिति के साथ कुछ समस्या है ओह, क्षमा करें, 'मुख्य' में त्रुटि को याद किया। संकेत के लिए धन्यवाद। मूल विश्लेषण अभी भी है; '['ऐसा नहीं है जो आपको लगता है। – tripleee