繁体   English   中英

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

[英]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 时遇到了同样的错误。

  • 我只是用我的NOTEPAD++ IDE 打开 configure.ac 文件。
  • 然后我将带有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

我知道我参加聚会为时已晚。 希望这可以帮助某人。

检查您的 .bashrc 文件。 也许重命名或移动它。

此处讨论: 无法获取简单的 bash 脚本

对于使用 MacOS 的人:

如果您收到一个 Windows 格式的文件并希望在 MacOS 上运行并看到此错误,请运行这些命令。

brew install dos2unix
sh <file.sh>

我只是将您的示例剪切并粘贴到一个文件中; 它在 bash 下运行良好。 我看不出有什么问题。

为了更好的衡量,您可能希望确保它以换行符结尾,尽管 bash 不应该关心。 (无论有没有最后的换行符,它都为我运行。)

如果您不小心在文件中嵌入了控制字符,您有时会看到奇怪的错误。 由于它是一个简短的脚本,请尝试通过从 StackOverflow 上的问题粘贴它来创建一个新脚本,或者简单地重新键入它。

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

祝你好运!

如果脚本本身有效并且没有语法错误,那么一些可能的原因可能是:

  • 无效的行尾(例如, \\r\\n而不是\\n
  • 文件开头存在byte order mark ( BOM )

两者都可以使用vimvi修复。

要修复行尾,请在 vim 和命令模式中打开文件:

:set ff=unix

要删除 BOM,请使用:

:set nobomb

对于那些没有安装dos2unix (并且不想安装它)的人:

删除导致此错误的尾随\\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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM