Shell 异常记录: [syntax error: unexpected end of file]

作者:zjruan 日期:2017-06-24
关键词:shell、终端、syntax error
描述:shell 脚本 异常问题记录

今天在测试 shell 脚本文件引入的功能,即 Shell 文件包含

. filename #注意(.)号与filename中间有空格
或
source filename

很简单的一条命令,但是执行却一直报错。于是写了几个demo来测试一下这个问题。环境是 Mac 下的终端。

Shell 异常记录: [syntax error: unexpected end of file]_第1张图片
shellTest.png

问题描述:

源码如上图,预期结果是

>sh index.sh
name.sh 文件存在
Hello zjruan

但是在执行index2.sh的时候,却报错了

>sh index2.sh
index2.sh: line 7: syntax error: unexpected end of file

也有可能是这样的错误

>sh index2.sh
'index2.sh: line 6: syntax error near unexpected token `
'index2.sh: line 6: `fi

问题分析:

一开始以为是代码的问题,于是将实例代码完全copy 下来,执行,但是依然报错,而且错误提示基本一致,于是排除手误写错代码的可能性,但是它报的是语法错误,所以先尝试这简化代码看看。

第一次尝试

我们将 index2.sh 精简到最简单,只有1条命令,

# index2.sh
pwd #打印当前位置

然后执行(sh index2.sh),结果执行正常,如下图

Shell 异常记录: [syntax error: unexpected end of file]_第2张图片
test1.png

第二次尝试

第一次尝试的成功,让我倍感兴奋,以为问题就要被解决。我们适当的增加了代码的负责度,变成了两行代码。
执行之后,我们发现报了一个错。这两行简单的代码,肯定不会写错,那再报错的,肯定就不是代码的问题,于是我们开始查看是不是环境的问题。

# index2.sh
pwd #打印当前位置
echo 'Hello'
>sh index2.sh
: command not foundpwd
Hello
Shell 异常记录: [syntax error: unexpected end of file]_第3张图片
test2.png

第三次尝试

将错误提示放到 google 和 百度 里都搜索了一下,关键词是:
syntax error near unexpected token \fi' my.sh: line 6: `fi'`

最终,在众多的文章里找到了这篇博客,与我的问题比较相似。
test.sh: line 8: syntax error near unexpected token `fi'
他的解决方式是:

Shell 异常记录: [syntax error: unexpected end of file]_第4张图片
image.png

于是我按照他的思路。将文件都删除了,使用我vim 新建了文件,在键入代码,发现执行成功。
但是这样太麻烦了。
现在写 demo 还可以删,但生产环境的shell脚本也是随便删的么?再说,再敲一遍敲过的代码,也是 特别烦人的。
于是就思考,window 的 文件格式 与 linux 有什么区别?

解决

window 文件与 linux 格式最多的区别是什么呢?
『换行符』
对就是它,
window下默认换行是 CRLF
linux 下默认换行是 LF
于是将文件在 CRLFLF间切换,再执行,发现问题复现 和 解决。

你可能感兴趣的:(Shell 异常记录: [syntax error: unexpected end of file])