作者:zjruan 日期:2017-06-24
关键词:shell、终端、syntax error
描述:shell 脚本 异常问题记录
今天在测试 shell 脚本文件引入的功能,即 Shell 文件包含
. filename #注意(.)号与filename中间有空格
或
source filename
很简单的一条命令,但是执行却一直报错。于是写了几个demo来测试一下这个问题。环境是 Mac 下的终端。
问题描述:
源码如上图,预期结果是
>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
),结果执行正常,如下图
第二次尝试
第一次尝试的成功,让我倍感兴奋,以为问题就要被解决。我们适当的增加了代码的负责度,变成了两行代码。
执行之后,我们发现报了一个错。这两行简单的代码,肯定不会写错,那再报错的,肯定就不是代码的问题,于是我们开始查看是不是环境的问题。
# index2.sh
pwd #打印当前位置
echo 'Hello'
>sh index2.sh
: command not foundpwd
Hello
第三次尝试
将错误提示放到 google 和 百度 里都搜索了一下,关键词是:
syntax error near unexpected token \
fi' my.sh: line 6: `fi'`
最终,在众多的文章里找到了这篇博客,与我的问题比较相似。
test.sh: line 8: syntax error near unexpected token `fi'
他的解决方式是:
于是我按照他的思路。将文件都删除了,使用我vim 新建了文件,在键入代码,发现执行成功。
但是这样太麻烦了。
现在写 demo 还可以删,但生产环境的shell脚本也是随便删的么?再说,再敲一遍敲过的代码,也是特别烦人的。
于是就思考,window 的 文件格式 与 linux 有什么区别?
解决
window 文件与 linux 格式最多的区别是什么呢?
『换行符』
对就是它,
window下默认换行是 CRLF
linux 下默认换行是 LF
于是将文件在 CRLF
与 LF
间切换,再执行,发现问题复现 和 解决。