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
相关产品推荐
相关产品推荐

