[英]Bash syntax error: unexpected end of file
原谅我这是 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 }
为了让愚蠢的解析器开心:
die () { test -n "$@" && echo "$@"; exit 1; }
我也刚刚通过在if
子句中使用错误的语法收到此错误消息
else if
(语法错误:文件意外结束)elif
(正确的语法)我通过注释位来调试它,直到它工作
未关闭的 if => fi 子句也会引发此问题
提示:如果您的脚本很大,请使用陷阱进行调试...
例如
set -x
trap read debug
我从StackOverflow 上的这个类似问题中得到了这个答案
在 Vim 中打开文件并尝试
:set fileformat=unix
将 eh 行结尾转换为 unix 结尾,看看是否能解决问题。 如果在 Vim 中编辑,输入命令 :set fileformat=unix 并保存文件。 其他几个编辑器具有转换行尾的能力,例如 Notepad++ 或 Atom
谢谢@lemongrassnginger
当我在一行中写下“if - 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 没有被标签化。
当我尝试使用括号调用函数时,这发生在我身上,例如
run() {
echo hello
}
run()
应该:
run() {
echo hello
}
run
对于 Windows:
就我而言,我在 Windows 操作系统上工作,并且在运行 autoconf 时遇到了同样的错误。
然后我将带有EOL转换的文件转换为Windows(CR LF) ,如下所示:
编辑 -> EOL 转换 -> WINDOWS (CR LF)
正如我刚刚发现的那样,在函数定义上缺少右大括号会导致此错误。
function whoIsAnIidiot() {
echo "you are for forgetting the closing brace just below this line !"
哪个当然应该是这样的……
function whoIsAnIidiot() {
echo "not you for sure"
}
就我而言,如下所示有一个多余的\\
:
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
的末尾没有\\
我能够将您的代码剪切并粘贴到一个文件中,并且它运行正常。 如果您像这样执行它,它应该可以工作:
你的“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
确保 .sh 文件所在目录的名称没有空格字符。 例如:假设它位于名为“新文件夹”的文件夹中,您一定会遇到您引用的错误。 而只是将其命名为“New_Folder”。 我希望这有帮助。
显然,当脚本的最后一行缺少换行符时,某些版本的 shell 也会发出此消息。
在 Ubuntu 中:
$ gedit ~/.profile
然后, File -> Save as
并将end line
设置为Unix/Linux
对于使用 MacOS 的人:
如果您收到一个 Windows 格式的文件并希望在 MacOS 上运行并看到此错误,请运行这些命令。
brew install dos2unix
sh <file.sh>
我只是将您的示例剪切并粘贴到一个文件中; 它在 bash 下运行良好。 我看不出有什么问题。
为了更好的衡量,您可能希望确保它以换行符结尾,尽管 bash 不应该关心。 (无论有没有最后的换行符,它都为我运行。)
如果您不小心在文件中嵌入了控制字符,您有时会看到奇怪的错误。 由于它是一个简短的脚本,请尝试通过从 StackOverflow 上的问题粘贴它来创建一个新脚本,或者简单地重新键入它。
你用的是什么版本的bash? ( bash --version
)
祝你好运!
如果脚本本身有效并且没有语法错误,那么一些可能的原因可能是:
\\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
如果您使用的是vscode,则可以创建一个 .editorconfig 文件并将其放入其中:
[*.sh]
end_of_line = cr
然后再次保存您的 bash 文件,据我所知,当您保存文件时,vscode 默认使用crlf
作为行尾来显示换行符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.