Shell脚本:“syntax error:unexpected end of file”

这种错误只能说是坑,如果没有见到过,很可能就要摔里头。解决问题是重要的,但弄明白问题的来源,往往更为重要。

所以要先扯一下,换行和回车的历史遗留问题。

在计算机出现之前,有个玩意叫电传打字机。每秒钟可以打10个字符,但是在打完一行需要换行时,要用去0.2s。

这正好可以打2个字符,这段时间里如果有字符传过来,那么这些字符将被丢失。

很显然,要解决这个问题,最简单的办法就是浪费这个0.2s。同时,我们在写东西时,要把手换到下一行及每行的首位置,也就是说这是两个动作。

自然而然地,研发人员在每一行后面添加了两个表示结束的字符(回车+换行)。

所谓“回车”:让打字机的打印头重新回到一行的首位置(左边界);所谓“换行”:让打字机把纸向下移一行。

后来,计算机来了,操作系统也来了。于是,坑也来了。不同的操作系统对这个机器的“复位+走纸”的表示是不同的:

OS

表示

C语言/转义字符

HEX表示

Windows

回车+换行(CR/LF)

\r\n

0x0d0a

Unix/Linux

换行(LF)

\n

0x0a

Mac OS

回车(CR)

\r

0x0d

于是,unix/mac下的文件如果在windows里打开,所有文字会变成一行;而windows的文件在unix/mac下打开,每行的结尾会多出一个 ^M 符号

 我想在linux下执行一个shell脚本,而它恰巧又在windows中打开过,于是我就狠狠地摔在了这个坑里。解决的办法自然很简单,一个dos2unix命令即可。

posted @ 2013-09-26 10:32  陈小硕  阅读(5068)  评论(0编辑  收藏  举报