जवाबों:
मुझे लगता है कि file.sh CRLF लाइन टर्मिनेटरों के साथ है।
Daud
dos2unix file.sh
तब समस्या ठीक हो जाएगी।
आप इसके साथ ubuntu में dos2unix स्थापित कर सकते हैं:
sudo apt-get install dos2unix
जांच करने के लिए एक और बात (बस मुझे पता चला):
यानी यह निर्दोष दिखने वाला स्निपेट उसी त्रुटि का कारण होगा:
die () { test -n "$@" && echo "$@"; exit 1 }
गूंगा पार्सर खुश करने के लिए:
die () { test -n "$@" && echo "$@"; exit 1; }
;प्रत्येक कथन के अंत के साथ समाप्त होने की उम्मीद की जा रही है ;ताकि अंत में जैसे: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fiउस त्रुटि का उत्पादन होगा, जबकि if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;नहीं होगा ... अंत में छोटे अर्ध-कॉलनों को नोटिस करें, अर्थात: के बाद .bashऔर fi।
zshउपयोगकर्ता से साझा की गई स्क्रिप्ट में यह था । पूर्व में काम करता है zsh, लेकिन नहीं में shहै और न ही bash। काश मैं 4 लोग थे तो मैं इस 4 अपवोट्स को दे सकता था
एक अन-बंद अगर => फाई क्लॉज इसे भी बढ़ाएगा
टिप: यदि आपकी स्क्रिप्ट बहुत बड़ी है, तो डीबग करने के लिए ट्रैप का उपयोग करें ...
जैसे
set -x
trap read debug
unexpected end of fileहोते ही त्रुटि हो जाएगी fi।
मुझे StackOverflow पर इसी तरह की समस्या से यह जवाब मिला
फ़ाइल को विम में खोलें और प्रयास करें
:set fileformat=unix
Eh लाइन एंडिंग को यूनिक्स एंडिंग्स में बदलें और देखें कि क्या यह समस्या हल करता है। यदि विम में संपादन हो रहा है, तो कमांड दर्ज करें: फाइलफॉर्मेट = यूनिक्स सेट करें और फाइल को सेव करें। कई अन्य संपादकों में लाइन एंडिंग्स को बदलने की क्षमता है, जैसे कि नोटपैड ++ या एटम
साभार @ शिलांगरासिंगिंगर
dos2unixजैसा कि स्वीकृत जवाब सलाह देता है।
इसलिए मुझे यह पोस्ट मिली और उत्तरों ने मेरी मदद नहीं की, लेकिन मुझे यह पता लगाने में सक्षम था कि इसने मुझे त्रुटि क्यों दी। मेरे पास था
cat > temp.txt < EOF
some content
EOF
मुद्दा यह था कि मैंने उपरोक्त कोड को एक फ़ंक्शन में कॉपी किया और अनजाने में कोड को टैब कर दिया। यह सुनिश्चित करने की आवश्यकता है कि अंतिम EOF टैब नहीं किया गया है।
EOFचार स्थानों से इंडेंट किया था और बैश ने इसकी वजह से इसे पार्स नहीं किया था। रिक्त स्थान हटाने से समस्या ठीक हो गई।
यह मेरे लिए तब हो रहा था जब मैं पैरेंस, उदाहरण के लिए एक फ़ंक्शन को कॉल करने की कोशिश कर रहा था
run() {
echo hello
}
run()
होना चाहिए:
run() {
echo hello
}
run
विंडोज के लिए:
मेरे मामले में, मैं विंडोज़ ओएस पर काम कर रहा था और ऑटोकॉन्फ़ चलाते समय मुझे वही त्रुटि मिली।
फिर मैंने फाइल को EOL रूपांतरण के साथ विंडोज (CR LF) में इस प्रकार रूपांतरित किया :
संपादित करें -> ईओल कन्वेंशन -> विन्डोज़ (सीआर एलएफ)
मैं आपके कोड को फ़ाइल में काटने और पेस्ट करने में सक्षम था और यह सही तरीके से चला। यदि आप इसे इस तरह निष्पादित करते हैं तो यह काम करना चाहिए:
आपका "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
मैंने आपका उदाहरण केवल एक फ़ाइल में काट दिया और चिपकाया; यह बैश के तहत ठीक चला। मुझे इसमें कोई समस्या नहीं दिख रही है।
अच्छे उपाय के लिए आप यह सुनिश्चित कर सकते हैं कि यह एक नई रेखा के साथ समाप्त हो जाए, हालांकि बैश को परवाह नहीं करनी चाहिए। (यह मेरे लिए अंतिम न्यूलाइन के साथ और बिना चलता है।)
यदि आपने गलती से फ़ाइल में एक नियंत्रण चरित्र एम्बेड कर दिया है, तो आपको कभी-कभी अजीब त्रुटियां दिखाई देंगी। चूंकि यह एक छोटी स्क्रिप्ट है, इसलिए इसे StackOverflow पर अपने प्रश्न से चिपकाकर, या केवल इसे पुनः टाइप करके एक नई स्क्रिप्ट बनाने का प्रयास करें।
आप किस संस्करण का उपयोग कर रहे हैं? ( bash --version)
सौभाग्य!
सुनिश्चित करें कि उस निर्देशिका का नाम, जिसमें .sh फ़ाइल मौजूद है, में स्पेस कैरेक्टर नहीं है। उदाहरण: यह कहें कि यदि यह 'नया फ़ोल्डर' नामक फ़ोल्डर में है, तो आप उस त्रुटि के लिए बाध्य होंगे जिसे आपने उद्धृत किया है। इसके बजाय इसे 'New_Folder' नाम दें। आशा है कि ये आपकी मदद करेगा।
मुझे पता है कि मुझे पार्टी में बहुत देर हो चुकी है। आशा है कि यह किसी की मदद कर सकता है।
अपनी .bashrc फ़ाइल की जाँच करें। शायद नाम बदलकर या स्थानांतरित करके।
यहां चर्चा: एक साधारण बैश स्क्रिप्ट को स्रोत करने में असमर्थ
मेरे मामले में, \निम्नलिखित में एक बेमानी है:
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