【发布时间】:2011-09-16 00:41:51
【问题描述】:
请原谅我,这是一个非常简单的 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 后:
语法错误:文件意外结束
【问题讨论】:
请原谅我,这是一个非常简单的 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
【讨论】:
要检查的另一件事(我刚刚想到):
即这个看起来很无辜的 sn-p 会导致同样的错误:
die () { test -n "$@" && echo "$@"; exit 1 }
为了让愚蠢的解析器开心:
die () { test -n "$@" && echo "$@"; exit 1; }
【讨论】:
; 每个语句都应该以; 结尾,所以把它放在最后,例如:if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi 会产生那个错误,而if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi; 不会......以冒号结尾,即:.bash 和 fi 之后。
zsh 用户与我共享的脚本中得到了这个。前者在zsh 中有效,但在sh 和bash 中无效。希望我是 4 个人,所以我可以给这 4 票
我也刚刚通过在 if 子句中使用错误的语法得到了这个错误消息
else if(语法错误:文件意外结束)elif(语法正确)我通过注释掉它来调试它直到它工作
【讨论】:
未关闭的 if => fi 子句也会引发此问题
提示:如果您的脚本很大,请使用陷阱进行调试...
例如
set -x
trap read debug
【讨论】:
unexpected end of file 错误将在fi 被击中时立即发生。
我从this similar problem on StackOverflow得到这个答案
在 Vim 中打开文件并尝试
:set fileformat=unix
将 eh 行结尾转换为 unix 结尾,看看是否解决了 问题。如果在 Vim 中编辑,输入命令 :set fileformat=unix 和 保存文件。其他几个编辑器具有转换行的能力 结尾,例如 Notepad++ 或 Atom
谢谢@lemongrassnginger
【讨论】:
dos2unix 的替代方法。
我在一行写“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(注意末尾附近的;)。
在 cygwin 上我需要:-
export SHELLOPTS
set -o igncr
在 .bash_profile 中。这样我就不需要运行 unix2dos
【讨论】:
所以我找到了这篇文章,答案对我没有帮助,但我能够弄清楚为什么它给了我错误。我有一个
cat > temp.txt < EOF
some content
EOF
问题是我将上面的代码复制到了一个函数中,并无意中标记了代码。需要确保最后一个 EOF 没有选项卡。
【讨论】:
EOF 缩进了四个空格,因此 bash 没有解析它。删除空格解决了这个问题。
这发生在我尝试使用括号调用函数时,例如
run() {
echo hello
}
run()
应该是:
run() {
echo hello
}
run
【讨论】:
函数定义中缺少右大括号会导致我刚刚发现的这个错误。
function whoIsAnIidiot() {
echo "you are for forgetting the closing brace just below this line !"
当然应该是这样的……
function whoIsAnIidiot() {
echo "not you for sure"
}
【讨论】:
对于 WINDOWS:
就我而言,我在 Windows 操作系统上工作,但在运行 autoconf 时遇到了同样的错误。
然后我将EOL转换成Windows (CR LF)的文件如下:
编辑 -> EOL 转换 -> WINDOWS (CR LF)
【讨论】:
在我的例子中,有一个多余的\,如下所示:
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
}
DATA.PATH_PREFIX ./afs/kinetics400 末尾有一个NOT\
【讨论】:
我能够将您的代码剪切并粘贴到一个文件中,并且它运行正常。如果你 像这样执行它应该可以工作:
你的“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
您可能会在输入时遇到错误 b/c(使用管道、胡萝卜、 等等。)。您也可以尝试将条件一分为二:
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 个参数(干净, 保持 POSIX shell 兼容性):
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
【讨论】:
我刚刚将您的示例剪切并粘贴到一个文件中;它在 bash 下运行良好。我认为它没有任何问题。
为了更好的衡量,您可能希望确保它以换行符结尾,尽管 bash 不应该在意。 (不管有没有最后的换行符,它都对我有用。)
如果您不小心在文件中嵌入了控制字符,您有时会看到奇怪的错误。由于它是一个简短的脚本,请尝试通过在 StackOverflow 上粘贴您的问题中的新脚本来创建一个新脚本,或者只需重新输入它。
您使用的是哪个版本的 bash? (bash --version)
祝你好运!
【讨论】:
确保 .sh 文件所在目录的名称没有空格字符。例如:假设它位于名为“新文件夹”的文件夹中,您一定会遇到您引用的错误。相反,只需将其命名为“New_Folder”。我希望这会有所帮助。
【讨论】:
显然,当脚本的最后一行缺少换行符时,某些版本的 shell 也会发出此消息。
【讨论】:
在 Ubuntu 中:
$ gedit ~/.profile
然后,File -> Save as 并将 end line 设置为 Unix/Linux
【讨论】:
【讨论】:
对于使用 MacOS 的人:
如果您收到 Windows 格式的文件并希望在 MacOS 上运行并看到此错误,请运行这些命令。
brew install dos2unix
sh <file.sh>
【讨论】:
如果脚本本身是有效的并且没有语法错误,那么一些可能的原因可能是:
\r\n 而不是 \n)byte order mark (BOM)两者都可以使用vim 或vi 修复。
要修复行尾,请在 vim 中打开文件并从命令模式键入:
:set ff=unix
要删除 BOM,请使用:
:set nobomb
【讨论】:
删除导致此错误的尾随 \r 字符:
sed -i 's/\r$//' filename
来自这个 StackOverflow 答案的详细信息。这真的很有帮助。 https://stackoverflow.com/a/32912867/7286223
【讨论】: