বাশ সিনট্যাক্স ত্রুটি: ফাইলের অপ্রত্যাশিত শেষ


102

এর জন্য আমাকে ক্ষমা করুন বাশের একটি খুব সাধারণ স্ক্রিপ্ট। কোডটি এখানে:

#!/bin/bash
# june 2011

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

sh file.sh চালানোর পরে:

বাক্য গঠন ত্রুটি: ফাইলের অপ্রত্যাশিত শেষ

উত্তর:


147

আমি মনে করি ফাইল.শ সিআরএলএফ লাইন টার্মিনেটরের সাথে রয়েছে।

চালান

dos2unix file.sh

তাহলে সমস্যাটি স্থির হয়ে যাবে।

আপনি এটি দিয়ে ওবুন্টুতে ডস 2 ইউনিক্স ইনস্টল করতে পারেন:

sudo apt-get install dos2unix

এই সমস্যার পিছনে কারণ কী? আমি সাধারণত উইন্ডোজে কাজ করি তবে স্ক্রিপ্টগুলি ইউনিক্স সিস্টেমে স্থানান্তর করতে হবে।
সিএমসিডিগ্রাগনকাই

উইন্ডোতে নতুন লাইনটি "\ r \ n" হয়, তবে লিনাক্সে "\ n" থাকে।
ক্লিফিশ

8
@ কেসেডকুটার আমি কেবল এটি বলব না কারণ কিছু আপনার পক্ষে কাজ করে নি যে আপনার এটি হ্রাস করা উচিত, স্পষ্টত এটি ২৮ টি উপভোটের পক্ষে কাজ করেছে। একটি সহজ এটি আমার পক্ষে যথেষ্ট কাজ করে না। এজন্য এসও একটি প্রশ্নের একাধিক উত্তর মঞ্জুরি দিয়েছিল কারণ কোনও সমস্যার একাধিক সমাধান হতে পারে।
জেফ উইলবার্ট

4
নোটপ্যাড ++ সম্পাদক ব্যবহার করে সম্পাদনা করুন> ইওল রূপান্তর> ওল্ড ম্যাক ফর্ম্যাটটি এটি আমার জন্য সমাধান করেছে।
রাক্তলে

আপনি যদি নোটপ্যাড ++ দিয়ে আপনার ব্যাশ ফাইলটি সম্পাদনা করতে পারেন। সম্পাদনা-> EOL রূপান্তর-> ম্যাকিনটোস (সিআর) এ যান। আপনি উইন্ডোজ ওএস ব্যবহার করে থাকলেও এটিকে ম্যাকিনটোস (সিআর) এ পরিবর্তন করুন।
জুনিয়র

133

আরেকটি জিনিস যাচাই করতে হবে (কেবল আমার কাছে ঘটেছে):

  • সেমিকোলনের সাথে একক-লাইন ফাংশনগুলির মৃতদেহগুলি সমাপ্ত করুন

অর্থাত এই নির্দোষ-স্নিপেট একই ত্রুটির কারণ ঘটবে:

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

বোবা পার্সারকে খুশি করতে:

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

4
+1 এছাড়াও এর মতো বন্ধনী সহ কোড স্নিপেটগুলিতে প্রযোজ্য: [["$ #" == 1]] && [["g আরগ" == [1,2,3,4]]] ও & মুদ্রণ "% s \ n "" ব্লাহ "|| {প্রিন্টফ "% s \ n" "ব্লহব্লাহ"; ব্যবহার; } ............ পূর্ববর্তী কিছু সংজ্ঞায়িত ফাংশন 'ব্যবহার' বলার পরে স্কুইগ্লি ব্র্যাকেটের ভিতরে সেমিকোলনটি লক্ষ্য করুন। ভুলে যাওয়ায় আপনি একই সিনট্যাক্স ত্রুটি পাবেন: অপ্রত্যাশিত e
সিবিহে

আপনি এটি পেরেক। প্রকৃতপক্ষে সহজ জিনিসটি ;প্রতিটি বিবৃতিটি ;এমনটি দিয়ে শেষ হওয়ার প্রত্যাশা করা হয় যাতে শেষের দিকে যেমন: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fiত্রুটিটি উত্পন্ন if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;করবে , তবে ... শেষের দিকে সামান্য আধা-কলোনগুলি লক্ষ্য করবে, যেমন: পরে .bashএবং fi
ইমানুয়েল মাহুনি

4
আমার কাছে এটি কোনও zshব্যবহারকারীর কাছ থেকে আমার সাথে ভাগ করা স্ক্রিপ্টে ছিল । প্রাক্তন কাজ করে zshকিন্তু না হয় shনা bash। আশা করি আমি 4 জন ছিলাম তাই আমি এই 4 টি উপস্থাপনাটি দিতে পারতাম
দাভোস

44

আমিও একটি ifধারাটিতে ভুল বাক্য গঠন ব্যবহার করে এই ত্রুটি বার্তাটি পেয়েছি

  • else if (বাক্য গঠন ত্রুটি: ফাইলের অপ্রত্যাশিত শেষ)
  • elif (সঠিক বাক্য গঠন)

এটি কাজ না করা পর্যন্ত আমি বিটকে মন্তব্য করে এটি ডিবাগ করেছিলাম


আপনাকে অনেক ধন্যবাদ .. কেউ দয়া করে এই লোকটিকে একটি মেডেল দিন
হ্যাপিহাপ্পি

21

একটি আন-ক্লোজড যদি => ফাই ক্লজটি এটিকেও বাড়িয়ে তুলবে

টিপ: আপনার স্ক্রিপ্টটি বিশাল হলে ডিবাগ করতে ট্র্যাপ ব্যবহার করুন ...

যেমন

set -x
trap read debug

4
আমি ঠিক "ফাই" ভুলে গেছি! ধন্যবাদ :) আপনি যদি সবার সুবিধার্থে করতে পারেন তবে ফাঁদ ব্যবহারের টিপটিতে কিছুটা বিশদভাবে জানাতে পারেন।
কার্লস

4
দেরি করার জন্য দুঃখিত, আমার বন্ধু। 'ট্র্যাপ' কমান্ড হ'ল প্রতিটি স্ক্রিপ্টের পরে প্রয়োজনীয়ভাবে ভেঙে আপনার স্ক্রিপ্টগুলি ডিবাগ করার। একটি পূর্ণাঙ্গ আলোচনা এখানে: stackoverflow.com/questions/9080431/...
theRiley

4
এটা অনেক ধন্যবাদ দরকারী ছিল। মনে রাখবেন যে আঘাতের সাথে সাথে unexpected end of fileত্রুটি ঘটবে fi
স্টিফেন বি।

8

স্ট্যাকওভারফ্লোতে এই জাতীয় সমস্যা থেকে আমি এই উত্তর পেয়েছি

ভিমে ফাইলটি খুলুন এবং চেষ্টা করুন

:set fileformat=unix

এএল লাইন এন্ডিংগুলিকে ইউনিক্স এন্ডিং এ রূপান্তর করুন এবং দেখুন যে এটি সমস্যার সমাধান করে। ভিমে সম্পাদনা করা হলে, কমান্ডটি প্রবেশ করুন: ফাইলফর্ম্যাট = ইউনিক্স সেট করুন এবং ফাইলটি সংরক্ষণ করুন। অন্যান্য বেশ কয়েকটি সম্পাদকের নোটপ্যাড ++ বা পরমাণুর মতো লাইন এন্ডিংগুলিকে রূপান্তর করার ক্ষমতা রয়েছে

ধন্যবাদ @ লেমনগ্রাসেঞ্জার


dos2unixগ্রহণযোগ্য উত্তরের পরামর্শ অনুসারে এটি করার বিকল্প উপায় are
ulidtko

7

সাইগউইনে আমার প্রয়োজন: -

 export SHELLOPTS
 set -o igncr

ইন .বাশ_প্রফাইলে। এইভাবে আমার ইউনিক্স 2 ডস চালানোর দরকার নেই


6

সুতরাং আমি এই পোস্টটি পেয়েছি এবং উত্তরগুলি আমাকে সহায়তা করে না তবে এটি কেন আমাকে ত্রুটি দিয়েছে তা আমি নির্ধারণ করতে সক্ষম হয়েছি। আমি একটি ছিল

cat > temp.txt < EOF
some content
EOF

সমস্যাটি হ'ল আমি উপরের কোডটি অনুলিপি করে একটি ফাংশনে থাকতে এবং অজান্তেই কোডটি ট্যাবড করেছিলাম। শেষ EOF ট্যাবড না হয়েছে তা নিশ্চিত করা দরকার।


4
এটা ঠিক আমার ক্ষেত্রে ছিল। আমি EOFচারটি স্পেসে ইন্ডেন্ট করেছি এবং বাশ এর কারণে এটি বিশ্লেষণ করতে পারে নি। স্পেসগুলি সরানো সমস্যার সমাধান করেছে।
এক্সেল

6

যখন আমি এক লাইনে "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

3

একটি ফাংশন সংজ্ঞায় একটি বন্ধনী বন্ধনী মিস করা এই ত্রুটির কারণ ঘটবে যেমন আমি সন্ধান করেছি।

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

অবশ্যই এর মতো হওয়া উচিত ...

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

2

উইন্ডো জন্য:

আমার ক্ষেত্রে, আমি উইন্ডোজ ওএসে কাজ করছিলাম এবং অটোকনফ চালানোর সময় আমি একই ত্রুটি পেয়েছি।

  • আমি কেবল আমার নোটপ্যাড ++ আইডিই দিয়ে কনফিগার.এক ফাইলটি খুলি ।
  • তারপরে আমি ইওএল রূপান্তরকরণের সাথে ফাইলটিকে উইন্ডোজ (সিআর এলএফ) এ নিম্নরূপে রূপান্তরিত করেছি :

    সম্পাদনা করুন -> ইওল রূপান্তর -> উইন্ডো (সিআর এলএফ)


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

আপনি কীভাবে ইনপুট (ডাব্লু / পাইপ, গাজর ইত্যাদি) করছেন সে বিষয়ে আপনি সম্ভবত ত্রুটিটি পেয়ে যাচ্ছেন / আপনি শর্তটি দুটি বিভক্ত করার চেষ্টা করতে পারেন:

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

আমি এখনও একই ত্রুটি পেয়েছি। কোডটি কোথায় ভুল হয়েছে ঠিক ঠিক তা নিশ্চিত নয়
মার্কক্রুজ

অদ্ভুত, আমি আপনার কোডটি কেটে পেস্ট করেছি এবং এটি প্রত্যাশার মতো কাজ করেছে। আর কোন ত্রুটি আউটপুট ছিল? অনেক সময় বাশ একটি লাইন নম্বর তালিকাভুক্ত করবে। এছাড়াও, আপনি কোন সিস্টেম চালাচ্ছেন? (লিনাক্স, ম্যাকস, বিএসডি, ডিস্ট্রো, ইত্যাদি)
অ্যারোনস্টেসি

1

আমার ক্ষেত্রে, \নিম্নলিখিতগুলির মতো একটি অনর্থক রয়েছে:

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


0

আমি কেবল একটি উদাহরণে আপনার উদাহরণ কেটে-পেস্ট করেছি; এটা বাশ অধীনে দৌড়ে। আমি এটি নিয়ে কোনও সমস্যা দেখছি না।

ভাল পরিমাপের জন্য আপনি এটি নিশ্চিত করতে চাইতে পারেন এটি একটি নতুন লাইনের সাথে শেষ হয়েছে, যদিও বাশের যত্ন নেওয়া উচিত নয়। (এটি আমার পক্ষে চূড়ান্ত নিউলাইন সহ এবং ছাড়াও উভয় পক্ষে চলে))

আপনি দুর্ঘটনাক্রমে ফাইলটিতে একটি নিয়ন্ত্রণ চরিত্র এম্বেড করলে আপনি কখনও কখনও অদ্ভুত ত্রুটি দেখতে পাবেন। যেহেতু এটি একটি শর্ট স্ক্রিপ্ট, তাই এখানে আপনার প্রশ্ন থেকে স্ট্যাকওভারফ্লোতে এটি আটকে দিয়ে বা কেবল পুনরায় টাইপ করে একটি নতুন স্ক্রিপ্ট তৈরি করার চেষ্টা করুন।

আপনি বাশের কোন সংস্করণ ব্যবহার করছেন? (bash --version )

শুভকামনা!


0

.Sh ফাইল যে ডিরেক্টরিটিতে উপস্থিত রয়েছে তার নামের কোনও স্থানের অক্ষর নেই তা নিশ্চিত করুন। উদাহরণস্বরূপ: বলুন এটি যদি 'নতুন ফোল্ডার' নামক ফোল্ডারে থাকে তবে আপনি যে ত্রুটিটি উদ্ধৃত করেছেন তা পূরণ করতে বাধ্য। পরিবর্তে এটি কেবল 'নতুন_ফোল্ডার' হিসাবে নাম দিন। আশা করি এটা কাজে লাগবে.


0

আপনার স্ক্রিপ্টের চূড়ান্ত লাইনটিতে একটি নতুন লাইনের অভাব থাকলে স্পষ্টতই, শেলের কয়েকটি সংস্করণও এই বার্তাটি প্রেরণ করতে পারে।


0

উবুন্টুতে:

$ gedit ~/.profile

তারপর, File -> Save asএবং সেট end lineকরারUnix/Linux


0

আমি জানি পার্টিতে আমার অনেক দেরি হয়েছে। আশা করি এটি কারও সাহায্য করবে।

আপনার .bashrc ফাইলটি পরীক্ষা করুন। সম্ভবত এটির নামকরণ বা সরানো।

এখানে আলোচনা: একটি সাধারণ বাশ স্ক্রিপ্ট উত্স করতে অক্ষম


0

MacOS ব্যবহারকারী লোকদের জন্য:

আপনি যদি উইন্ডোজ ফর্ম্যাট সহ কোনও ফাইল পেয়ে থাকেন এবং ম্যাকওএসে চালনা করতে চান এবং এই ত্রুটিটি দেখে এই কমান্ডগুলি চালান।

brew install dos2unix
sh <file.sh>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.