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

Bash语法错误:意外的文件结尾,bash,syntax,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后: 语法错误:意外的文件结尾 我能够将您的代码剪切并粘贴到一个文件中,并且运行正常。如果你 按如下方式执行,它应该可以工作: 您的“file.sh”: 命令: $ ./f

请原谅,这是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”:

命令:

$ ./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外壳兼容性):


我只是把你的例子剪切粘贴成一个文件;它在猛击下运行良好。我看不出有什么问题

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

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

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


祝你好运

我认为file.sh使用CRLF行终止符

然后问题就解决了

您可以通过以下方式在ubuntu中安装dos2unix:

sudo apt-get install dos2unix
关于cygwin,我需要:-

 export SHELLOPTS
 set -o igncr
在.bash_配置文件中。这样我就不需要运行unix2dos了(我刚刚想到):

  • 用分号终止单行函数体
也就是说,这个看似无辜的代码段将导致相同的错误:

die () { test -n "$@" && echo "$@"; exit 1 }
要让哑巴解析器高兴,请执行以下操作:

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

我还通过在
if
子句中使用错误的语法得到了这个错误消息

  • else if
    (语法错误:意外的文件结尾)
  • elif
    (语法正确)

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

确保存在.sh文件的目录名没有空格字符。e、 g:假设它在一个名为“新文件夹”的文件夹中,你肯定会遇到你所引用的错误。只需将其命名为“新建文件夹”。我希望这能有所帮助。

所以我找到了这篇文章,答案对我没有帮助,但我能够找出它给我错误的原因。我有一个

cat > temp.txt < EOF
some content
EOF
cat>temp.txt

问题是我将上述代码复制到函数中,无意中对代码进行了标记。需要确保最后一个EOF没有标记

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

unclosed if=>fi子句也会发出此消息

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

e、 g

这个答案是我从

在Vim中打开该文件并重试

:设置fileformat=unix

将eh行结尾转换为unix结尾,看看这是否解决了问题 问题如果在Vim中编辑,请输入命令:set fileformat=unix和 保存文件。其他几个编辑器可以转换行 结尾,如记事本++或Atom

感谢Ubuntu中的@lemongrassinger

$ gedit ~/.profile

然后,
文件->另存为
并将
结束行
设置为
Unix/Linux

当我在一行中编写“if-fi”语句时出现问题:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
写入多行解决了我的问题:

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

我知道我来不及参加聚会了。希望这能帮助别人

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


这里的讨论:

当我试图使用parens调用函数时,这种情况就发生了,例如

run() {
  echo hello
}

run()
应该是:

run() {
  echo hello
}

run

适用于WINDOWS:

在我的例子中,我在Windows操作系统上工作,在运行autoconf时遇到了相同的错误

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

    编辑->下线转换->窗口(CR LF)


对于使用MacOS的用户:

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

brew install dos2unix
sh <file.sh>
brew安装dos2unix
嘘

正如我刚刚发现的,函数定义中缺少右大括号将导致此错误

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\u前缀的末尾有NOTa
\
。/afs/kinetics400

我仍然得到相同的错误。我不太清楚代码哪里出错了。奇怪的是,我剪切并粘贴了你的代码,它按预期工作。是否还有其他错误输出?很多时候bash会列出一个行号。还有,你在运行什么系统?(Linux、MacOS、BSD、发行版等)这个问题背后的原因是什么?我通常在Windows上工作,但需要将脚本传输到unix系统。Windows中的换行符是“\r\n”,而linux中的换行符是“\n”。@KeesdeKooter我不会因为某些东西不适合你就说你应该否决它,很明显,它对28票的赞成票有效。一个对我不起作用的简单例子就足够了。这就是为什么允许对一个问题有多个答案的原因,因为一个问题可以有多个解决方案。使用记事本++编辑器编辑>EOL转换>旧Mac格式为我解决了这个问题。在安装之前,请尝试(在vim中)“:set fileformat=unix”。这对我在Windows Linux子系统(WSL)中起到了作用。+1也适用于带括号的代码段,如:[[“$#”==1]&&&[“$arg”==1,2,3,4]]&&printf“%s\n”blah“|{printf”%s\n“blahblah”;用法:。。。。。。。。。。。。请注意,分号在曲线中
brew install dos2unix
sh <file.sh>
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
}