最近博主在写一个shell脚本,写完之后到linux环境去执行,发现莫名其妙地报错了,如下:

这简直是莫名其妙,因为这个脚本昨天晚上还是跑得好好的,只是今天上午我稍微加了一些逻辑判断而已,居然报错了!

不过,既然报的是 ./test-fail.sh: line 29: syntax error: unexpected end of file 

这可是语法错误啊,脚本解析器肯定不会骗人,因为我的执行环境只有我一个人用,没有动过。

下面是我对这个问题的问题思路和解决方法:

一、首先交代下我的编程方式:

我是在Windows下使用sublime编辑器编写shell脚本,然后通过rsync软件同步到linux环境,使用的是ubuntu20.04。

因为平时有时候编译代码会遇到代码文件编码的问题,所以我第一个怀疑是不是windows的编码方式的问题,比如是dos格式,我们就需要在linux环境下使用dos2unix工具转换成unix格式,这个主要印象的是换行问题,"\r\n" 变成 "\n"。

在linux下有个file命令可以查看文件的类型,查询如下:

一些列操作之后,发现于事无补。那就接着往下查呗。

二、代码昨晚还好好的,就是因为加了几行代码,就不行了,那我应该要好好看看加的什么代码。

为了引入不必要的代码干扰,我把无关的内容都删除了,再把脚本的内容贴出来:


#!/bin/bash -e

MODULE=2
SUPPORT_MODULES=(1 2 3 4 5 6)
SUPPORT_MODULES_SOCS=(a b c d e f)

function get_soc_name_by_module_name()
{
	module=$1
	len=${#SUPPORT_MODULES[@]}
	i=0
	for((i=0;i<$len;i=i+1)); do
    		if [ $module = ${SUPPORT_MODULES[i]} ]; then
    			break
    		fi
    	done
	if [ $i = $len ]; then
		echo "Unsupport MODULE_NAME: $module"
		exit 1
	fi
	SOC_NAME=${SUPPORT_MODULES_SOCS[i]
}

echo "shell script start ..."
get_soc_name_by_module_name $MODULE
echo "SOC_NAME=$SOC_NAME, MODULE_NAME=$MODULE"
echo "shell script end ..."

 OK 代码逻辑很简单,就是输入一个MODULE-NAME,然后根据内置的映射表,找到其对应的SOC-NAME。

我相信第一眼看到这段代码的时候,你也会好奇,“这代码没毛病啊”!

但是它却是,报了【语法错误】。

既然语法错误,无非就是写的语句不符合语法,比如没有fi,比如花括号不配对等等。

我灵机一动,notepad++不是可以支持shell语法高亮吗?打开看下,不就一目了然?

我试着用notepad++打开了下:

果不其然,真有问题。

正常的花括号的颜色是第9行这样的,而23行的花括号,颜色明显不对,证明确实存在语法问题。

仔细一看,原来是22行尾部的 } 被回车到23行了,导致22行的写法是不完整的。

OK。22行补上一个 } 就完事了。

 改完后,测试一把,OK了。

再次比对下,真的就是一个花括号搞死人。

好了,这期的介绍就到这里了。

总结一下:syntax error: unexpected end of file

1)出现这个错误,先检查文件的编码问题,如果没有问题再往下排查;

2)使用带shell语法高亮的编辑器,比如notepad++,查看明显的语法问题,加以修改。

更多推荐

【shell编程】shell脚本运行报错:syntax error: unexpected end of file