बैश सिंटैक्स त्रुटि: फ़ाइल का अप्रत्याशित अंत


98

इसके लिए मुझे माफ कर दो, बश में एक बहुत ही सरल स्क्रिप्ट है। यहाँ कोड है:

#!/bin/bash
# june 2011

if [ $# -lt 3 -o $# -gt 3 ]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi

श फाइल चलाने के बाद। श:

सिंटैक्स त्रुटि: फ़ाइल का अप्रत्याशित अंत

जवाबों:


137

मुझे लगता है कि file.sh CRLF लाइन टर्मिनेटरों के साथ है।

Daud

dos2unix file.sh

तब समस्या ठीक हो जाएगी।

आप इसके साथ ubuntu में dos2unix स्थापित कर सकते हैं:

sudo apt-get install dos2unix

इस समस्या के पीछे का कारण क्या है? मैं आमतौर पर विंडोज पर काम करता हूं लेकिन स्क्रिप्ट को यूनिक्स सिस्टम में स्थानांतरित करने की आवश्यकता है।
CMCDragonkai

विंडोज़ में न्यूलाइन "\ r \ n" है, जबकि लिनक्स में "\ n" है।
क्लेफ़िश

8
@KeesdeKooter मैं सिर्फ इसलिए नहीं कहूंगा कि आपके लिए कुछ ऐसा काम नहीं हुआ है कि आपको इसे कम करना चाहिए, स्पष्ट रूप से इसने 28 अपवोट के लिए काम किया। एक साधारण यह मेरे लिए काम नहीं करता था। इसलिए SO ने एक प्रश्न के कई उत्तरों की अनुमति दी क्योंकि समस्या के कई समाधान हो सकते हैं।
जेफ विल्बर्ट

2
नोटपैड ++ संपादक संपादित करें> ईओएल रूपांतरण> पुराने मैक प्रारूप का उपयोग करके इसे मेरे लिए हल किया गया।
राकेट

यदि आप नोटपैड ++ के साथ अपनी बैश फाइल को एडिट कर सकते हैं। Edit-> EOL रूपांतरण-> Macintosh (CR) पर जाएं। भले ही आप Windows OS का उपयोग कर रहे हों, इसे Macintosh (CR) में बदल दें।
जूनियर

127

जांच करने के लिए एक और बात (बस मुझे पता चला):

  • अर्धविराम के साथ एकल-पंक्ति कार्यों के निकाय समाप्त करें

यानी यह निर्दोष दिखने वाला स्निपेट उसी त्रुटि का कारण होगा:

die () { test -n "$@" && echo "$@"; exit 1 }

गूंगा पार्सर खुश करने के लिए:

die () { test -n "$@" && echo "$@"; exit 1; }

3
+1 भी इस तरह से कोष्ठक के साथ कोड स्निपेट पर लागू होता है: [["$ #" == 1]] && [["$ arg" == [1,2,3,4]]] और& प्रिंटफ "% s \ n "" ब्लाह "|| {प्रिंटफ़ "% s \ n" "ब्लाहबला"; उपयोग; } ..... यह भूल जाना कि आपको एक ही वाक्यविन्यास त्रुटि मिलेगी: अप्रत्याशित ईओएफ।
Cbhihe

आप इसे किसी न किसी। वास्तव में साधारण बात यह है कि ;प्रत्येक कथन के अंत के साथ समाप्त होने की उम्मीद की जा रही है ;ताकि अंत में जैसे: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fiउस त्रुटि का उत्पादन होगा, जबकि if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;नहीं होगा ... अंत में छोटे अर्ध-कॉलनों को नोटिस करें, अर्थात: के बाद .bashऔर fi
इमैनुएल महुनी

1
मेरे पास एक zshउपयोगकर्ता से साझा की गई स्क्रिप्ट में यह था । पूर्व में काम करता है zsh, लेकिन नहीं में shहै और न ही bash। काश मैं 4 लोग थे तो मैं इस 4 अपवोट्स को दे सकता था
दावोस

41

मैं भी सिर्फ एक ifखंड में गलत वाक्यविन्यास का उपयोग करके इस त्रुटि संदेश मिला है

  • else if (सिंटैक्स त्रुटि: फ़ाइल का अप्रत्याशित अंत)
  • elif (सही वाक्यविन्यास)

जब तक यह काम करता है मैंने बिट्स पर टिप्पणी करके इसे डीबग कर दिया



16

एक अन-बंद अगर => फाई क्लॉज इसे भी बढ़ाएगा

टिप: यदि आपकी स्क्रिप्ट बहुत बड़ी है, तो डीबग करने के लिए ट्रैप का उपयोग करें ...

जैसे

set -x
trap read debug

1
मैं बिल्कुल "फाई" भूल गया! धन्यवाद :) यदि आप, सभी के लाभ के लिए, जाल का उपयोग करने की अपनी टिप पर थोड़ा विस्तार कर सकते हैं।
कार्ल्स अल्कोली

3
देरी के लिए खेद है, मेरे दोस्त। 'ट्रैप' कमांड हर लाइन के बाद संभावित रूप से टूटकर आपकी स्क्रिप्ट को डीबग करने का एक तरीका है। एक फुलर चर्चा यहाँ है: stackoverflow.com/questions/9080431/…
-Riley

1
यह उपयोगी बहुत धन्यवाद था। ध्यान दें कि हिट unexpected end of fileहोते ही त्रुटि हो जाएगी fi
स्टीफन बी

8

मुझे StackOverflow पर इसी तरह की समस्या से यह जवाब मिला

फ़ाइल को विम में खोलें और प्रयास करें

:set fileformat=unix

Eh लाइन एंडिंग को यूनिक्स एंडिंग्स में बदलें और देखें कि क्या यह समस्या हल करता है। यदि विम में संपादन हो रहा है, तो कमांड दर्ज करें: फाइलफॉर्मेट = यूनिक्स सेट करें और फाइल को सेव करें। कई अन्य संपादकों में लाइन एंडिंग्स को बदलने की क्षमता है, जैसे कि नोटपैड ++ या एटम

साभार @ शिलांगरासिंगिंगर


ये केवल वैकल्पिक तरीके हैं, dos2unixजैसा कि स्वीकृत जवाब सलाह देता है।
10

7

सागविन पर मुझे ज़रूरत थी: -

 export SHELLOPTS
 set -o igncr

.bash_profile में। इस तरह मुझे unix2dos चलाने की आवश्यकता नहीं थी


6

इसलिए मुझे यह पोस्ट मिली और उत्तरों ने मेरी मदद नहीं की, लेकिन मुझे यह पता लगाने में सक्षम था कि इसने मुझे त्रुटि क्यों दी। मेरे पास था

cat > temp.txt < EOF
some content
EOF

मुद्दा यह था कि मैंने उपरोक्त कोड को एक फ़ंक्शन में कॉपी किया और अनजाने में कोड को टैब कर दिया। यह सुनिश्चित करने की आवश्यकता है कि अंतिम EOF टैब नहीं किया गया है।


1
यह वास्तव में मेरा मामला था। मैंने EOFचार स्थानों से इंडेंट किया था और बैश ने इसकी वजह से इसे पार्स नहीं किया था। रिक्त स्थान हटाने से समस्या ठीक हो गई।
एएक्सएल

5

जब मैंने "if - fi" स्टेटमेंट एक लाइन में लिखा तो मुझे समस्या हुई:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

मेरी समस्या का हल बहुभाषी लिखें:

if [ -f ~/.git-completion.bash ]; then 
    . ~/.git-completion.bash
 fi

3

यह मेरे लिए तब हो रहा था जब मैं पैरेंस, उदाहरण के लिए एक फ़ंक्शन को कॉल करने की कोशिश कर रहा था

run() {
  echo hello
}

run()

होना चाहिए:

run() {
  echo hello
}

run

2

विंडोज के लिए:

मेरे मामले में, मैं विंडोज़ ओएस पर काम कर रहा था और ऑटोकॉन्फ़ चलाते समय मुझे वही त्रुटि मिली।

  • मैं बस अपने NOTEPAD ++ IDE के साथ config.ac फ़ाइल खोलता हूं ।
  • फिर मैंने फाइल को EOL रूपांतरण के साथ विंडोज (CR LF) में इस प्रकार रूपांतरित किया :

    संपादित करें -> ईओल कन्वेंशन -> विन्डोज़ (सीआर एलएफ)


1

मैं आपके कोड को फ़ाइल में काटने और पेस्ट करने में सक्षम था और यह सही तरीके से चला। यदि आप इसे इस तरह निष्पादित करते हैं तो यह काम करना चाहिए:

आपका "file.sh":

#!/bin/bash
# june 2011

if [ $# -lt 3 -o $# -gt 3 ]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi

आदेश:

$ ./file.sh arg1 arg2 arg3

ध्यान दें कि "file.sh" निष्पादन योग्य होना चाहिए:

$ chmod +x file.sh

आपको वह त्रुटि b / c मिल रही है कि आप कैसे इनपुट कर रहे हैं (w / a पाइप, गाजर, आदि)। आप हालत को दो में विभाजित करने का भी प्रयास कर सकते हैं:

if [ $# -lt 3 ] || [ $# -gt 3 ]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi

या, जब से आप उपयोग कर रहे हैं bash, आप अंतर्निहित सिंटैक्स का उपयोग कर सकते हैं:

if [[ $# -lt 3 || $# -gt 3 ]]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi

और, अंत में, आप निश्चित रूप से जांच कर सकते हैं कि क्या 3 तर्क दिए गए थे (स्वच्छ, POSIX शेल संगतता बनाए रखता है):

if [ $# -ne 3 ]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi

मुझे अभी भी वही त्रुटि मिली है। im बिल्कुल सही नहीं है जहाँ कोड गलत हो जाता है
markcruz

अजीब, मैंने आपके कोड को काट दिया और चिपका दिया और यह उम्मीद के मुताबिक काम किया। क्या कोई और त्रुटि आउटपुट था? बहुत समय बैश एक लाइन नंबर सूचीबद्ध करेगा। यह भी, आप कौन सी प्रणाली चला रहे हैं? (लिनक्स,
मैकओएस

0

मैंने आपका उदाहरण केवल एक फ़ाइल में काट दिया और चिपकाया; यह बैश के तहत ठीक चला। मुझे इसमें कोई समस्या नहीं दिख रही है।

अच्छे उपाय के लिए आप यह सुनिश्चित कर सकते हैं कि यह एक नई रेखा के साथ समाप्त हो जाए, हालांकि बैश को परवाह नहीं करनी चाहिए। (यह मेरे लिए अंतिम न्यूलाइन के साथ और बिना चलता है।)

यदि आपने गलती से फ़ाइल में एक नियंत्रण चरित्र एम्बेड कर दिया है, तो आपको कभी-कभी अजीब त्रुटियां दिखाई देंगी। चूंकि यह एक छोटी स्क्रिप्ट है, इसलिए इसे StackOverflow पर अपने प्रश्न से चिपकाकर, या केवल इसे पुनः टाइप करके एक नई स्क्रिप्ट बनाने का प्रयास करें।

आप किस संस्करण का उपयोग कर रहे हैं? ( bash --version)

सौभाग्य!


0

सुनिश्चित करें कि उस निर्देशिका का नाम, जिसमें .sh फ़ाइल मौजूद है, में स्पेस कैरेक्टर नहीं है। उदाहरण: यह कहें कि यदि यह 'नया फ़ोल्डर' नामक फ़ोल्डर में है, तो आप उस त्रुटि के लिए बाध्य होंगे जिसे आपने उद्धृत किया है। इसके बजाय इसे 'New_Folder' नाम दें। आशा है कि ये आपकी मदद करेगा।


0

जाहिरा तौर पर, शेल के कुछ संस्करण भी इस संदेश का उत्सर्जन कर सकते हैं जब आपकी स्क्रिप्ट की अंतिम पंक्ति में एक नई रेखा का अभाव होता है।


0

उबंटू में:

$ gedit ~/.profile

फिर, File -> Save asऔर करने के end lineलिए सेट करेंUnix/Linux


0

मुझे पता है कि मुझे पार्टी में बहुत देर हो चुकी है। आशा है कि यह किसी की मदद कर सकता है।

अपनी .bashrc फ़ाइल की जाँच करें। शायद नाम बदलकर या स्थानांतरित करके।

यहां चर्चा: एक साधारण बैश स्क्रिप्ट को स्रोत करने में असमर्थ


0

MacOS का उपयोग करने वाले लोगों के लिए:

अगर आपको विंडोज फॉर्मेट वाली फाइल मिली है और वह MacOS पर चलना चाहता है और इस त्रुटि को देखते हुए, इन कमांड्स को रन करें।

brew install dos2unix
sh <file.sh>

0

एक फंक्शन डेफिनेशन पर क्लोजिंग ब्रेस गुम होने से यह त्रुटि हो जाएगी जैसा कि मैंने अभी खोजा है।

function whoIsAnIidiot() {
    echo "you are for forgetting the closing brace just below this line !"

ऐसा कौन सा कोर्स होना चाहिए ...

function whoIsAnIidiot() {
    echo "not you for sure"
}

0

मेरे मामले में, \निम्नलिखित में एक बेमानी है:

function foo() {
    python tools/run_net.py \
                           --cfg configs/Kinetics/X3D_8x8_R50.yaml \
                           NUM_GPUS 1 \
                           TRAIN.BATCH_SIZE 8 \
                           SOLVER.BASE_LR 0.0125 \
                           DATA.PATH_TO_DATA_DIR ./afs/kinetics400 \
                           DATA.PATH_PREFIX  ./afs/kinetics400  \  # Error
}

नहीं है नहीं एक \के अंत मेंDATA.PATH_PREFIX ./afs/kinetics400

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