Bash syntax error: unexpected end of file

BashSyntax

Bash Problem Overview


Forgive me for this is a very simple script in Bash. Here's the code:

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

after running sh file.sh:

> syntax error: unexpected end of file

Bash Solutions


Solution 1 - Bash

I think file.sh is with CRLF line terminators.

run

dos2unix file.sh

then the problem will be fixed.

You can install dos2unix in ubuntu with this:

sudo apt-get install dos2unix

Solution 2 - Bash

Another thing to check (just occured to me):

  • terminate bodies of single-line functions with semicolon

I.e. this innocent-looking snippet will cause the same error:

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

To make the dumb parser happy:

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

Solution 3 - Bash

i also just got this error message by using the wrong syntax in an if clause

  • else if (syntax error: unexpected end of file)
  • elif (correct syntax)

i debugged it by commenting bits out until it worked

Solution 4 - Bash

an un-closed if => fi clause will raise this as well

tip: use trap to debug, if your script is huge...

e.g.

set -x
trap read debug

Solution 5 - Bash

I got this answer from this similar problem on StackOverflow

Open the file in Vim and try

:set fileformat=unix

> Convert eh line endings to unix endings and see if that solves the > issue. If editing in Vim, enter the command :set fileformat=unix and > save the file. Several other editors have the ability to convert line > endings, such as Notepad++ or Atom

Thanks @lemongrassnginger

Solution 6 - Bash

I had the problem when I wrote "if - fi" statement in one line:

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

Write multiline solved my problem:

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

Solution 7 - Bash

So I found this post and the answers did not help me but i was able to figure out why it gave me the error. I had a

cat > temp.txt < EOF
some content
EOF

The issue was that i copied the above code to be in a function and inadvertently tabbed the code. Need to make sure the last EOF is not tabbed.

Solution 8 - Bash

on cygwin I needed:-

 export SHELLOPTS
 set -o igncr

in .bash_profile . This way I didn't need to run unix2dos

Solution 9 - Bash

This was happening for me when I was trying to call a function using parens, e.g.

run() {
  echo hello
}

run()

should be:

run() {
  echo hello
}

run

Solution 10 - Bash

FOR WINDOWS:

In my case, I was working on Windows OS and I got the same error while running autoconf.

  • I simply open configure.ac file with my NOTEPAD++ IDE.

  • Then I converted the File with EOL conversion into Windows (CR LF) as follows:

    EDIT -> EOL CONVERSION -> WINDOWS (CR LF)

Solution 11 - Bash

Missing a closing brace on a function definition will cause this error as I just discovered.

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

Which of course should be like this...

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

Solution 12 - Bash

I was able to cut and paste your code into a file and it ran correctly. If you execute it like this it should work:

Your "file.sh":

#!/bin/bash
# june 2011

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

The command:

$ ./file.sh arg1 arg2 arg3

Note that "file.sh" must be executable:

$ chmod +x file.sh

You may be getting that error b/c of how you're doing input (w/ a pipe, carrot, etc.). You could also try splitting the condition into two:

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

Or, since you're using bash, you could use built-in syntax:

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

And, finally, you could of course just check if 3 arguments were given (clean, maintains POSIX shell compatibility):

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

Solution 13 - Bash

In my case, there is a redundant \ in the like following:

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
}

There is NOT a \ at the end of DATA.PATH_PREFIX ./afs/kinetics400

Solution 14 - Bash

I just cut-and-pasted your example into a file; it ran fine under bash. I don't see any problems with it.

For good measure you may want to ensure it ends with a newline, though bash shouldn't care. (It runs for me both with and without the final newline.)

You'll sometimes see strange errors if you've accidentally embedded a control character in the file. Since it's a short script, try creating a new script by pasting it from your question here on StackOverflow, or by simply re-typing it.

What version of bash are you using? (bash --version)

Good luck!

Solution 15 - Bash

Make sure the name of the directory in which the .sh file is present does not have a space character. e.g: Say if it is in a folder called 'New Folder', you're bound to come across the error that you've cited. Instead just name it as 'New_Folder'. I hope this helps.

Solution 16 - Bash

Apparently, some versions of the shell can also emit this message when the final line of your script lacks a newline.

Solution 17 - Bash

In Ubuntu:

$ gedit ~/.profile

Then, File -> Save as and set end line to Unix/Linux

Solution 18 - Bash

I know I am too late to the party. Hope this may help someone.

Check your .bashrc file. Perhaps rename or move it.

Discussion here: https://stackoverflow.com/questions/55720897/unable-to-source-a-simple-bash-script/55751299?noredirect=1#comment98182583_55751299

Solution 19 - Bash

For people using MacOS:

If you received a file with Windows format and wanted to run on MacOS and seeing this error, run these commands.

brew install dos2unix
sh <file.sh>

Solution 20 - Bash

If the the script itself is valid and there are no syntax errors, then some possible causes could be:

  • Invalid end-of-lines (for example, \r\n instead of \n)
  • Presence of the byte order mark (BOM) at the beginning of the file

Both can be fixed using vim or vi.

To fix line endings open the file in vim and from the command mode type:

:set ff=unix

To remove the BOM use:

:set nobomb

Solution 21 - Bash

For those who don't have dos2unix installed (and don't want to install it):

Remove trailing \r character that causes this error:

sed -i 's/\r$//' filename

Details from this StackOverflow answer. This was really helpful. https://stackoverflow.com/a/32912867/7286223

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmarkcruzView Question on Stackoverflow
Solution 1 - BashclyfishView Answer on Stackoverflow
Solution 2 - BashulidtkoView Answer on Stackoverflow
Solution 3 - BashmarengazView Answer on Stackoverflow
Solution 4 - BashtheRileyView Answer on Stackoverflow
Solution 5 - BashJay KilleenView Answer on Stackoverflow
Solution 6 - BashSergeyView Answer on Stackoverflow
Solution 7 - BashRafael UrenaView Answer on Stackoverflow
Solution 8 - BashzzapperView Answer on Stackoverflow
Solution 9 - BashChristian ScottView Answer on Stackoverflow
Solution 10 - BashJuniarView Answer on Stackoverflow
Solution 11 - BashMikeView Answer on Stackoverflow
Solution 12 - BashaaronstacyView Answer on Stackoverflow
Solution 13 - BashoneView Answer on Stackoverflow
Solution 14 - BashAdam LissView Answer on Stackoverflow
Solution 15 - Bashuser5770325View Answer on Stackoverflow
Solution 16 - BashtripleeeView Answer on Stackoverflow
Solution 17 - BashNebView Answer on Stackoverflow
Solution 18 - Bashviggy28View Answer on Stackoverflow
Solution 19 - BashvmorusuView Answer on Stackoverflow
Solution 20 - BashccpizzaView Answer on Stackoverflow
Solution 21 - BashRaihanul Alam HridoyView Answer on Stackoverflow