आप यह मानने की सामान्य गलती कर रहे हैं कि [
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 वापस करना होगा, लेकिन हो सकता है कि आप यह सत्यापित करने का प्रयास कर रहे हैं कि स्ट्रिंग मेल नहीं खाती है?)
ध्यान दें कि कम से कम बैश संस्करण 4 में, आपको नियमित अभिव्यक्ति उद्धृत नहीं करना चाहिए : ऐसा करने से सरल स्ट्रिंग मिलान को मजबूर किया जाता है - [यहां दस्तावेज] (http://www.gnu.org/software/bash/manual/bashref.html#index-g_t_005b_005b-57)। साथ ही, आपको 'तर्क के लिए' $ @ "' उद्धरण के साथ, या तर्क के लिए सरल 'का उपयोग करना चाहिए; करें ... ' –
आपको अपने रेगेक्स को एक चर में रखना चाहिए। 'पैटर्न = '^ ... कुछ regexp ... $'; अगर [[$ 1 = ~ $ पैटर्न]] '। ध्यान दें कि डबल स्क्वायर ब्रैकेट के अंदर, चर को उद्धृत करना आवश्यक नहीं है और जैसा कि ग्लेन ने कहा है, रेगेक्स (चर) को कभी उद्धृत नहीं किया जाना चाहिए। –