Bash语法错误:意外的文件结束

mar*_*ruz 89 syntax bash

请原谅我这是Bash中一个非常简单的脚本.这是代码:

#!/bin/bash
# june 2011

if [ $# -lt 3 -o $# -gt 3 ]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi
Run Code Online (Sandbox Code Playgroud)

运行sh file.sh后:

语法错误:意外的文件结束

cly*_*ish 124

我认为file.sh与CRLF行终止符有关.

dos2unix file.sh
Run Code Online (Sandbox Code Playgroud)

然后问题将得到解决.

您可以在ubuntu中安装dos2unix:

sudo apt-get install dos2unix
Run Code Online (Sandbox Code Playgroud)

  • @KeesdeKooter我不会说只是因为某些东西对你没有用,你应该对它进行投票,显然它适用于28个upvotes.一个简单的它对我不起作用就足够了.这就是为什么SO允许问题的多个答案,因为可以存在多个问题的解决方案. (7认同)
  • 使用notepad ++编辑器编辑> EOL转换>旧Mac格式为我解决了它. (2认同)

uli*_*tko 108

要检查的另一件事(刚刚发生在我身上):

  • 用分号终止单行函数体

即这个看似无辜的片段会导致同样的错误:

die () { test -n "$@" && echo "$@"; exit 1 }
Run Code Online (Sandbox Code Playgroud)

让哑巴解析器开心:

die () { test -n "$@" && echo "$@"; exit 1; }
Run Code Online (Sandbox Code Playgroud)

  • +1也适用于带括号的代码片段:[["$#"== 1]] && [["$ arg"== [1,2,3,4]]] && printf"%s \n ""等等"|| {printf"%s \n""blahblah"; 用法; } ............请注意,在调用一些先前定义的函数'usage'之后,在squiggly括号内的分号.忘记这会得到相同的语法错误:意外的eof. (3认同)
  • 我在一个“zsh”用户与我共享的脚本中得到了这个。前者在“zsh”中有效,但在“sh”或“bash”中无效。希望我是 4 个人,这样我就可以给这 4 票 (2认同)

mar*_*gaz 32

我也只是通过在if子句中使用错误的语法得到此错误消息

  • else if (语法错误:意外的文件结尾)
  • elif (正确的语法)

我通过注释位来调试它,直到它工作

  • 非常感谢...有人请给这个人一枚奖章 (3认同)

the*_*ley 13

一个未关闭的if => fi子句也会引发这种情况

提示:如果您的脚本很大,请使用陷阱进行调试...

例如 __CODE__

  • 我完全忘记了“fi”!谢谢:)如果您可以,为了每个人的利益,详细说明您使用 trap 的技巧。 (2认同)
  • 对不起,我的朋友.''trap'命令是一种通过在每一行之后彻底破坏来调试脚本的方法.更全面的讨论在这里:/sf/ask/635630201/ (2认同)
  • 这很有用,非常感谢。请注意,一旦点击了“fi”,就会发生“意外的文件结尾”错误。 (2认同)

小智 10

当我在一行中写下“if - fi”语句时遇到了问题:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
Run Code Online (Sandbox Code Playgroud)

写多行解决了我的问题:

if [ -f ~/.git-completion.bash ]; then 
    . ~/.git-completion.bash
 fi
Run Code Online (Sandbox Code Playgroud)

  • 您也可以将其保留为一行,如下所示: `if [ -f ~/.git-completion.bash ]; 然后 。〜/ .git-completion.bash;fi`(注意末尾处的“;”)。 (2认同)

zza*_*per 7

在cygwin我需要: -

 export SHELLOPTS
 set -o igncr
Run Code Online (Sandbox Code Playgroud)

在.bash_profile中.这样我就不需要运行unix2dos了


Jay*_*een 7

我从StackOverflow上的这个类似问题得到了这个答案

在Vim中打开文件并尝试

:set fileformat=unix

将eh行结尾转换为unix结尾,看看是否能解决问题.如果在Vim中编辑,请输入命令:set fileformat = unix并保存文件.其他几个编辑器可以转换行结尾,例如Notepad ++或Atom

谢谢@lemongrassnginger


小智 5

所以我发现这篇文章和答案并没有帮助我,但我能够弄清楚为什么它给了我错误.我曾有一个

cat > temp.txt < EOF
some content
EOF
Run Code Online (Sandbox Code Playgroud)

问题是我将上面的代码复制到一个函数中并无意中标记了代码.需要确保最后一个EOF没有标签.

  • 这正是我的情况。我的“EOF”缩进了四个空格,因此 bash 没有解析它。删除空格解决了这个问题。 (2认同)

Chr*_*ott 5

当我尝试使用括号调用函数时,这发生在我身上,例如

run() {
  echo hello
}

run()
Run Code Online (Sandbox Code Playgroud)

应该:

run() {
  echo hello
}

run
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!!这只是我的问题,我认为这与其他答案有关。 (2认同)

Jun*_*iar 5

对于 Windows:

就我而言,我正在使用 Windows 操作系统,并且在运行 autoconf 时遇到了相同的错误。

  • 我只需使用我的NOTEPAD++ IDE打开configure.ac 文件。
  • 然后我将带有EOL转换的文件转换为Windows (CR LF),如下所示:

    编辑 -> EOL 转换 -> WINDOWS (CR LF)