对不起,这是一个非常简单的 Bash 脚本。以下是代码:
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
运行sh file.sh后:
语法错误:意外的文件结尾
dos2unix file.sh
那么问题将被解决。
你可以在Ubuntu中使用以下命令安装dos2unix:
sudo apt-get install dos2unix
还有一件需要检查的事情(突然想到):
也就是说,这个看似无害的片段会导致相同的错误:
die () { test -n "$@" && echo "$@"; exit 1 }
为了让这个不灵敏的解析器满意:die () { test -n "$@" && echo "$@"; exit 1; }
;
。每个语句都需要以 ;
结尾,所以在末尾加上它,例如:如果 [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi 将产生错误,而 if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;
则不会出错……注意一下小小的分号,即在 .bash
和 fi
后面。 - Emmanuel Mahunizsh
用户分享的脚本中得到了这个。前者在 zsh
中可以工作,但在 sh
和 bash
中无法工作。真希望我是四个人,这样我就可以给它四个赞了。 - Davos我刚刚因在一个 if
从句中使用错误的语法而遇到了这个错误消息。
else if
(语法错误:意外的文件结尾)elif
(正确的语法)我通过注释一些代码来进行调试,直到它能够正常工作。
一个未关闭的if => fi子句也会引发此错误。
提示:如果你的脚本非常庞大,可以使用trap进行调试...
例如:
set -x
trap read debug
fi
,就会出现“意外文件结尾”错误。 - Stephane B.在Vim中打开文件并尝试
:set fileformat=unix
将行结尾符转换为Unix格式,看看是否解决了问题。如果在Vim中编辑,请输入命令:set fileformat=unix并保存文件。其他一些编辑器也可以转换行结尾符,例如Notepad++或Atom
感谢@lemongrassnginger
dos2unix
。 - ulidtko当我将"if-fi"语句写在一行时,遇到了问题:
if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
使用多行解决了我的问题:
if [ -f ~/.git-completion.bash ]; then
. ~/.git-completion.bash
fi
if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi
(注意末尾附近的;
)。 - YorSubs当我尝试使用括号调用函数时,就会发生这种情况,例如:
run() {
echo hello
}
run()
应该是:
run() {
echo hello
}
run
我发现了这篇帖子,但里面的答案并没有帮助到我,不过最终我还是找到了问题出在哪里。我有一个
cat > temp.txt < EOF
some content
EOF
EOF
缩进了四个空格,因此 bash 没有解析它。移除空格后问题得到解决。 - ᴍᴇʜᴏᴠ export SHELLOPTS
set -o igncr
在 .bash_profile 中添加这个命令,这样我就不需要运行 unix2dos 命令了。
针对Windows操作系统:
在我的情况下,我正在使用Windows操作系统,在运行autoconf时遇到了相同的错误。
然后,我将文件转换为 Windows (CR LF) 格式,并进行了EOL转换。具体方法如下:
编辑 -> EOL转换 -> Windows (CR LF)