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

原谅我这是在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之后:

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

我认为file.sh是与CRLF行终止符。

 dos2unix file.sh 

那么问题就会被修复。

你可以在Ubuntu下安装dos2unix:

 sudo apt-get install dos2unix 

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

  • 用分号终止单行函数的主体

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

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

为了让愚蠢的parsing器高兴:

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

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

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

我debugging它通过评论比特,直到它的工作

在cygwin我需要: –

  export SHELLOPTS set -o igncr 

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

所以我发现这个post,答案没有帮助我,但我能弄清楚为什么它给了我错误。 我曾有一个

 cat > temp.txt < EOF some content EOF 

问题是我复制上面的代码是在一个函数中,并无意中标签的代码。 需要确保最后一个EOF没有选项卡。

一个非closures的if => fi子句也会引发这个问题

提示:使用陷阱来debugging,如果你的脚本是巨大的…

例如, set -x trap read debug ...

我能够将你的代码剪切并粘贴到一个文件中,并且正确运行。 如果你像这样执行它应该工作:

你的“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 

你可能会得到你input的错误b / c(用pipe道,胡萝卜等)。 你也可以尝试将条件分成两部分:

 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个参数(clean,维护POSIX shell兼容性):

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

我只是将你的例子粘贴到一个文件中; 它在bash下运行得很好。 我没有看到任何问题。

对于好的措施,你可能想确保它以换行符结束,虽然bash应该不在意。 (无论是否有最终的换行符,它都会运行。)

如果您不小心在文件中embedded了控制字符,您有时会看到奇怪的错误。 由于它是一个简短的脚本,请尝试通过在StackOverflow中将您的问题粘贴到此脚本来创build一个新脚本,或者只需重新input脚本即可。

你使用的是什么版本的bash? ( bash --version

祝你好运!

确保.sh文件所在目录的名称没有空格字符。 例如:说出它是否在一个名为“新build文件夹”的文件夹中,你一定会遇到你引用的错误。 相反,只需将其命名为“New_Folder”即可。 我希望这有帮助。

显然,当你的脚本的最后一行没有换行符的时候,shell的某些版本也会发出这个消息。