अगर, एलिफ, बाश में और बयान जारी करता है


358

मैं बाहर काम करने के क्या निम्नलिखित के साथ इस मुद्दे नहीं कर पा रहे ifबयान के संबंध में है elifऔर then। ध्यान रखें printfकि अभी भी विकास जारी है, मैं अभी तक बयान में इसका परीक्षण नहीं कर पाया हूं इसलिए यह गलत होने की संभावना से अधिक है।

मुझे जो त्रुटि मिल रही है, वह है:

./timezone_string.sh: line 14: syntax error near unexpected token `then'
./timezone_string.sh: line 14: `then'

और वक्तव्य ऐसा है।

if [ "$seconds" -eq 0 ];then
   $timezone_string="Z"
elif[ "$seconds" -gt 0 ]
then
   $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
else
   echo "Unknown parameter"
fi

7
मुझे आश्चर्य है कि क्यों हम की जरूरतthen में बयान ifऔर elifनहीं बल्कि में else, और यह भी सामान्य रूप में।

@ w17t, क्योंकि हमें अनुक्रम से स्थिति को अलग करने की आवश्यकता है।
साशा

3
@codeforester मैं 500K विचारों के प्रश्न को एक डुप्लिकेट के रूप में चिह्नित करने पर ज्यादा तर्क नहीं देखता, जिसमें केवल 5K है
फेडोरक्वी 'एसओ स्टॉप हॉर्मिंग'

कुछ कोड ऑटो-फ़ॉर्मेटिंग टूल का उपयोग करने से कोष्ठक के चारों ओर रिक्त स्थान को स्वचालित रूप से जोड़कर / हटाकर आपकी मदद कर सकते हैं। आप अपने संपादक के लिए प्लगइन्स खोज सकते हैं।
एनजे सुबेदी

जवाबों:


453

बीच में एक जगह गायब है elifऔर [:

elif[ "$seconds" -gt 0 ]

होना चाहिए

elif [ "$seconds" -gt 0 ]

जैसा कि मैंने देखा कि इस सवाल को बहुत सारे विचार मिल रहे हैं, यह इंगित करना महत्वपूर्ण है कि निम्नलिखित सिंटैक्स का पालन करना है:

if [ conditions ]
# ^ ^          ^

अर्थ है कि कोष्ठक के चारों ओर रिक्त स्थान की आवश्यकता है । अन्यथा, यह काम नहीं करेगा। इसका कारण यह है है [ही है एक कमांड।

कारण है कि आप की तरह कुछ क्यों नहीं देख रहे हैं elif[: command not found(या समान) है कि देखने के बाद है ifऔर then, खोल या तो की तलाश में है elif, elseया fi। हालाँकि यह एक और then(गलत स्वरूप के बाद elif[) पाता है । स्टेटमेंट को पार्स करने के बाद ही इसे निष्पादित किया जाएगा (और elif[: command not foundआउटपुट जैसा कोई त्रुटि संदेश )।


33
ब्रैकेट्स को रिक्त स्थान की आवश्यकता होने का कारण यह है कि वे वास्तविक कार्यक्रमों के लिए सिर्फ शॉर्टकट हैं (कम से कम पहले ब्रैकेट, दूसरा एक सिंटैक्टिक चीनी है जैसा कि मैं इसे समझता हूं)। इसका अर्थ निकालने के लिए, बाएं ब्रैकेट के लिए वास्तविक मैनपेज देखें:$ man [
माइकल जोहान्सन

3
क्या यह पोस्ट टाइपो के रूप में बंद नहीं होनी चाहिए?
zx8754

3
@ zx8754 हो सकता था, लेकिन इस त्रुटि को ठीक करने के लिए यह एक विहित तरीका नहीं था, जो काफी उपयोगी (360K विचार और गिनती) दिखता है।
फेडोरक्वी 'एसओ ने

3
मेरे कुछ साथी "स्पेस" या "कोडिंग स्टाइल" की अवधारणा को नहीं समझते हैं, इसलिए यह एक टाइपो नहीं हो सकता है।
14

3
[टेस्ट कमांड के लिए एक प्रकार का उपनाम है। यही कारण है कि रिक्त चरित्र की आवश्यकता है। if test "$seconds" -eq 0; then ... fiके बराबर है if [ "$seconds" -eq 0 ];then ... fi ]। @ लेय्यांग man testवह है जो आप वास्तव में देख रहे हैं
मेलिस्सेर

303

आपके पास अपनी स्क्रिप्ट के साथ कुछ वाक्यविन्यास मुद्दे हैं। यहाँ एक निश्चित संस्करण है:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi

76
ताज्जुब है, यह एकमात्र पूर्ण और सरल bash "इफ-तब-और" निर्माण था जो मैंने स्टैटेक्सचेंज पर आसानी से पाया ... धन्यवाद।
वाइल्डकार्ड

1
इंडेंटेशन वैकल्पिक है। दुभाषिया (और होना चाहिए) हो सकता है #!/bin/sh

3
@ Chinggis6 कुल बकवास, दुभाषिया हो सकता है #!/bin/shलेकिन नहीं है।
कैमुसेंसी

4
@Camusensei यह कुल बकवास नहीं है क्योंकि shइसका उपयोग उच्च संगतता के लिए किया जा सकता है (सभी * निक्स डिस्ट्रोस में डिफ़ॉल्ट शेल के रूप में बैश नहीं है (कुछ में ksh या ash है लेकिन उनमें से अधिकांश shकार्य करने के लिए मानक पर निर्भर हैं )। इसके अलावा bash के विशिष्ट या उन्नत सुविधाओं का उपयोग स्क्रिप्ट में नहीं किया जा रहा है, तब 'श' का उपयोग दुभाषिया (इसके लिए एक और कारण) के रूप में किया जाना चाहिए क्योंकि यह स्क्रिप्ट को खुद से संभाल सकता है।

6
@ चिंगगिस 6 सच, मेरी तरफ शब्दों का बुरा विकल्प।
कैमुसेंसी

25

[एक कमांड (या कुछ गोले में एक अंतर्निहित) है। पूर्व कथन से इसे व्हाट्सएप द्वारा अलग किया जाना चाहिए:

elif [

3
यह एक बिलिन द्वारा बैश में लिया गया है, लेकिन आपका संदेश अभी भी सही है। type -a [देखने के लिए उपयोग करें।
कैमुसेंसी

यह एक द्विआधारी भी है जो मुझे हमेशा अजीब लगता था।
mr.zog

4

मैं आपको बैश में कंडीशनिंग की मूल बातों पर एक नज़र रखने की सलाह दूंगा।

प्रतीक "[" एक कमांड है और इसके पहले एक व्हाट्सएप होना चाहिए। यदि आप अपने एलिफ के बाद व्हाट्सएप नहीं देते हैं, तो सिस्टम एलिफ की व्याख्या करता है [ विशेष आदेश के रूप में, जो निश्चित रूप से वह नहीं है जो आप इस समय चाहते हैं।

उपयोग:

elif(A COMPULSORY WHITESPACE WITHOUT PARENTHESIS)[(A WHITE SPACE WITHOUT PARENTHESIS)conditions(A WHITESPACE WITHOUT PARENTHESIS)]

संक्षेप में, अपना कोड सेगमेंट संपादित करें:

elif [ "$seconds" -gt 0 ]

आप कोई संकलन त्रुटियों के साथ ठीक हो जाएगा। आपका अंतिम कोड खंड इस तरह दिखना चाहिए:

#!/bin/sh    
if [ "$seconds" -eq 0 ];then
       $timezone_string="Z"
    elif [ "$seconds" -gt 0 ]
    then
       $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
    else
       echo "Unknown parameter"
    fi

2

आपके प्रोग्राम के बीच elifऔर [बाकी जगह की जगह सही है। आपको इसे ठीक करने की आवश्यकता है। यहाँ तय कार्यक्रम है:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi

इस बैश से संबंधित उपयोगी लिंक यदि कथन है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.