You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本报end of file unexpected(expecting "fi")错误原因咨询

Shell提交校验脚本语法错误原因

问题复现

编写的仓库提交信息格式校验Shell脚本内容如下:

#!/bin/sh


i=1
for label in 'Mod Name' 'Issue No' 'UT Status' 'Dev ID' 'Loc'; do
    if ! grep -q "^    $((i++)). $label:" $1; then
        cat <<- EOF
            Proposed message does not satisfy this repository's exacting standards
            It must match the template:
                1. Mod Name: xxx
                2. Issue No: xxx
                3. UT Status: xxx
                4. Dev ID: xxx
                5. Loc: xxx

            The proposed message does not contain the label: $label" >&2
        EOF
        exit 1
    fi
done

执行脚本时抛出报错:

28: /mtp-test/script.sh: Syntax error: end of file unexpected (expecting "fi"))

错误原因

报错的核心是here-document(即EOF包裹的文本块)语法使用不规范,加上额外的语法笔误,导致Shell解析时无法正常识别代码块闭合,具体问题有三个:

  • 第一,<<- EOF语法对结束标记的缩进有严格要求:结束符EOF所在行的开头只能用Tab制表符缩进,不能用空格。如果你的脚本里EOF前面是空格缩进,Shell不会判定这是文本块的结束位置,会一直往后读取内容直到文件末尾,自然找不到和if配对的fi,直接触发文件意外结束的语法错误。
  • 第二,重定向符号位置写错了。>&2的作用是把cat的输出转到标准错误,这个语法应该写在cat命令的末尾,也就是EOF标记的后面,而不是写在EOF包裹的文本内容里。写在块内部的话Shell只会把它当成普通文本,不会识别为命令语法。
  • 第三,存在孤立的多余双引号。文本块里$label后面多打了一个没有配对开头的双引号",会打乱Shell的语法解析状态,进一步加剧解析错误。

内容的提问来源于stack exchange,提问作者user4948798

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:57:34