यदि शर्त में "अपर संचालक अपेक्षित" त्रुटि


225

मैं यह पता लगाने की कोशिश कर रहा हूं कि इसमें क्या गलत है लेकिन अभी यह पता नहीं लगा सकता है।

यह हिस्सा एक त्रुटि हो रहा है लगता है ..

elif [ $operation = "man" ]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [ -z $aug1 ]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

मुझे यह त्रुटि मिली:

calc_1.2: line 75: [: =: unary operator expected

4
मुझे लगता है कि ifलाइन 75 पर आपके बयान की जरूरत है fi
स्टीव

7
यदि संदेह है, तो var को उद्धृत करें।
कोला

9
@koola, 'हमेशा' उद्धरण vars।
चचेरी बहन

जवाबों:


480

यदि आप जानते हैं कि आप हमेशा बैश का उपयोग करने जा रहे हैं, तो [[ ... ]]पॉज़िक्स-संगत सिंगल ब्रैकेट संस्करण के बजाय डबल ब्रैकेट सशर्त कंपाउंड कमांड का उपयोग करना हमेशा आसान होता है [ ... ]। एक [[ ... ]]परिसर के अंदर , शब्द-विभाजन और पथनाम विस्तार शब्दों पर लागू नहीं होते हैं, इसलिए आप पर भरोसा कर सकते हैं

if [[ $aug1 == "and" ]];

$aug1स्ट्रिंग के साथ के मूल्य की तुलना करने के लिए and

यदि आप उपयोग करते हैं [ ... ], तो आपको हमेशा इस तरह दोहरे उद्धरण चिह्नों को याद रखना होगा:

if [ "$aug1" = "and" ];

यदि आप चर विस्तार को उद्धृत नहीं करते हैं और चर अपरिभाषित या खाली नहीं है, तो यह अपराध के दृश्य से गायब हो जाता है, केवल छोड़कर

if [ = "and" ]; 

जो एक मान्य सिंटैक्स नहीं है। (यह एक अलग त्रुटि संदेश के साथ भी विफल हो जाएगा यदि $aug1सफेद स्थान या शेल मेटाचैकर्स शामिल हैं।)

आधुनिक [[ऑपरेटर में बहुत सी अन्य अच्छी विशेषताएं हैं, जिनमें नियमित अभिव्यक्ति मिलान शामिल है।


9
"आधुनिक"? नहीं [ हमेशा हमेशा की तरह है ? यह कोर्न शेल में बीस साल से अधिक समय से है, और प्री-डेट बैश है। (मुझे पता है कि आपका क्या मतलब है)
cdarke

31

मुझे इसे खोजने में थोड़ा समय लगा, लेकिन ध्यान दें कि यदि आपके पास रिस्पांसिंग एरर है तो आपको भी वही त्रुटि मिलेगी:

[: =: unary operator expected

सही बात:

if [ "$APP_ENV" = "staging" ]

बनाम

if ["$APP_ENV" = "staging" ]

हमेशा -xडिबग वैरिएबल सेट करने से इन्हें खोजने में मदद मिलती है:

set -x

एक बिल्ड स्क्रिप्ट में किसी ने इस बग को मेरे सामने रखा। मुझे कुछ समय बचाया, धन्यवाद!
काइल

8

बयानों $aug1में इसका उपयोग करने से पहले एक मूल्य निर्दिष्ट करने का प्रयास करें if[]; त्रुटि संदेश बाद में गायब हो जाएगा।


0

आप कहें ... :

elif [$ ऑपरेशन = "आदमी"]; फिर अगर [$ aug1 = "जोड़ें"]; फिर # <- लाइन 75 इको "मैन पेज फॉर: एड" ईको "" इको "सिंटेक्स: एड [नंबर 1] [नंबर 2]" इको "" इको "विवरण:" इको "दो अलग-अलग संख्याओं को एक साथ जोड़ें।" इको "" इको "जानकारी:" इको "v1.0 में जोड़ा गया" इको "" एलिफ [-z $ अगस्त 1]; तब गूंज "कृपया मैन पेज पढ़ने के लिए एक कमांड निर्दिष्ट करें।" और प्रतिध्वनि "उस आदेश के लिए कोई मैनुअल पृष्ठ नहीं है।" फाई

मुझे लगता है कि इसकी बस जगह ... इस तरह से करें:

elif [$operation = "man"]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [-z $aug1]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

-11

आप चर के लिए एक डिफ़ॉल्ट मान भी सेट कर सकते हैं, इसलिए आपको दो "[" का उपयोग करने की आवश्यकता नहीं है, जो एक के बजाय दो प्रक्रियाओं ("[" वास्तव में एक कार्यक्रम है)।

यह इस सिंटैक्स द्वारा जाता है: $ {VARIABLE: -default}।

पूरी बात को इस तरह से सोचा जाना चाहिए कि यह "डिफ़ॉल्ट" मान "मान्य" मूल्य / सामग्री से कुछ अलग है।

यदि यह किसी कारण से संभव नहीं है, तो आपको "अगर [-z $ VARIABLE] की तर्ज पर, साथ ही अगर कोई मान है, तो जाँच करने जैसा कोई कदम जोड़ने की आवश्यकता है;" "चर को भरने की आवश्यकता है" या " यदि [-z $ VARIABLE]; तो # सब कुछ ठीक है, बाकी स्क्रिप्ट के साथ आगे बढ़ें "।


3
[[दो प्रक्रियाओं को जन्म नहीं दे रहा है, यह एक शेल बिलिन है (और [बैश बिलिन भी है)। [[से अलग है [ [, जो [एक स्ट्रिंग के रूप में दूसरे को मानता है
user123444555621
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.