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的某些版本也会发出这个消息。