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

时间:2011-06-16 02:34:28

标签: bash syntax

请原谅我这是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后

  

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

19 个答案:

答案 0 :(得分:106)

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

运行

dos2unix file.sh

然后问题就解决了。

您可以使用以下命令在ubuntu中安装dos2unix:

sudo apt-get install dos2unix

答案 1 :(得分:94)

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

  • 以分号
  • 终止单行函数体

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

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

让愚蠢的解析器开心:

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

答案 2 :(得分:27)

我也是通过在if子句

中使用错误的语法得到此错误消息
  • else if(语法错误:意外的文件结尾)
  • elif(正确的语法)

我通过注释位来调试它直到它工作

答案 3 :(得分:11)

未关闭的if => fi子句也会提出这个问题

提示:如果您的脚本很大,请使用陷阱进行调试......

e.g。 set -x trap read debug ...

答案 4 :(得分:6)

关于cygwin我需要: -

 export SHELLOPTS
 set -o igncr
<。>在.bash_profile中。这样我就不需要运行unix2dos

答案 5 :(得分:6)

我从this similar problem on StackOverflow

得到了这个答案

在Vim中打开文件并尝试

:set fileformat=unix

  

将eh行结尾转换为unix结尾,看看是否能解决问题   问题。如果在Vim中编辑,请输入命令:set fileformat = unix and   保存文件。其他几个编辑器有能力转换线   结尾,例如Notepad ++或Atom

谢谢@lemongrassnginger

答案 6 :(得分:5)

所以我发现这篇文章并且答案对我没有帮助,但我能够弄清楚为什么它给了我错误。我有一个

cat > temp.txt < EOF
some content
EOF

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

答案 7 :(得分:3)

如我刚发现的那样,在函数定义上缺少右花括号会导致此错误。

function whoIsAnIidiot() {
    echo "you are for forgetting the closing brace just below this line !"

当然应该是这样的...

function whoIsAnIidiot() {
    echo "not you for sure"
}

答案 8 :(得分:2)

在我的情况下,如下所示有一个多余的\

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
}

\的末尾有{strong>否一个DATA.PATH_PREFIX ./afs/kinetics400

答案 9 :(得分:1)

我在一行中编写“ if-fi”语句时遇到了问题:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

写多行代码解决了我的问题:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

答案 10 :(得分:1)

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

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

答案 11 :(得分:0)

显然,当脚本的最后一行缺少换行符时,某些版本的shell也会发出此消息。

答案 12 :(得分:0)

确保.sh文件所在目录的名称没有空格字符。例如:假设它位于名为“新文件夹”的文件夹中,您必须遇到您引用的错误。而只是将其命名为&#39; New_Folder&#39;。我希望这会有所帮助。

答案 13 :(得分:0)

在Ubuntu中:

$ gedit ~/.profile

然后,File -> Save as并将end line设置为Unix/Linux

答案 14 :(得分:0)

我知道我参加聚会太晚了。希望这可以帮助某人。

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

此处讨论:https://firebase.google.com/docs/functions/video-series/

答案 15 :(得分:0)

例如,当我尝试使用parens调用函数时,这种情况正在发生。

run() {
  echo hello
}

run()

应为:

run() {
  echo hello
}

run

答案 16 :(得分:0)

对于Windows:

就我而言,我在Windows操作系统上工作,并且在运行autoconf时遇到相同的错误。

  • 我只需使用 NOTEPAD ++ IDE打开configure.ac文件。
  • 然后我将通过 EOL 转换的文件转换为 Windows(CR LF),如下所示:

    编辑-> EOL转换-> WINDOWS(CR LF)

答案 17 :(得分:0)

对于使用MacOS的用户:

如果您收到Windows格式的文件并想在MacOS上运行并看到此错误,请运行以下命令。

brew install dos2unix
sh <file.sh>

答案 18 :(得分:0)

我只是将您的示例剪切并粘贴到文件中;它在bash下运行良好。我没有看到任何问题。

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

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

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

祝你好运!