Bash syntax error: unexpected end of file
BashSyntaxBash 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