SHELL脚本“syntaxerror:unexpectedendoffile”解决⽅案[半原
创]
⽬前发现运⾏shell脚本时, 出现"syntax error: unexpected end of file"的情况有三种, 第三种应该有很多变异的情况
第⼀种, 常说的window下编写的shell脚本, 放到linux下运⾏会出现这种报错, 因为win下编写的shell脚本的格式是dos格式的, 这情况⽹上的解决办法有很多,如下:
如果确实是这种情况,在windows下写好了Shell 但是在linux下⽤:
sh -n [filesName]  检查语法总是出⼀个错误 syntax error:unexpected end of file
原因如下:
dos⽂件传输到unix系统时,会在每⾏的结尾多⼀个^M,在vi的时候,当你⽤如下命令
:set fileformat=unix当前页面脚本发生错误
:w
就会看到这些存在于每⾏结尾的^M符号,这个就是产⽣syntax error:unexpected end of file的原因
解决⽅案:
在vi下把这些^M都删除后即可。
也可以使⽤Linux下的⼯具:dos2unix也可轻松将⼀个windows下的⽂本⽂件转化为Unix兼容的格式。
第⼆种情况(copy)
不是由于windows和Linux相互拷贝⽂件⽽导致的。这个是语法错误嘛,由于我这个shell脚本有点⼤,看了⼀阵⼦也没发现是那句话语法错误了,所以不得不⽤⼆分法来查原因,不断注释⼀些代码,然后⽤sh -n test.sh来做语法检查,直到最后到那⼀段或者哪⼀⾏代码引起的错误。我发现是下⾯这⾏代码引起的,你能看出其中的问题吗?^_^
[ -d /home/repo/${SPPATH} ] || { mkdir -p /home/repo/${SPPATH}; cd /home/repo/${SPPATH}; git init >> $GITLOG 2>&1 }
嗯,其实我⽤花括号{}是想把⼏个命令组合起来在当前shell中执⾏,然后我犯了⼀个语法错误,在最后的⼀个命令后没有加分号(;)。
将这⾏改为如下即可(添加⼀个最后的分号):
[ -d /home/repo/${SPPATH} ] || { mkdir -p /home/repo/${SPPATH}; cd /home/repo/${SPPATH}; git init >> $GITLOG 2>&1; }
关于当前shell中执⾏⼀组命令,特别要注意的是,在”{“的右边和”}“的左边,⾄少要间隔⼀个以上的空格,⽽且每个命令都要以分号(;)作为结尾。
第三种情况(low)
  虽然很low, 但还是觉得有必要记录⼀下!
  那就是, 当你的shell脚本有语法问题的时候, 也会导致报同样的错, 这么说来, 和第⼆种情况是⼀样的......(不管了, 就当是第⼆种情况的⼀个分⽀吧)
  看下⾯的代码, 你能发现么, (估计都新⼿都能发现 ^^)
  test()
  {  echo "test shell script";  }
  test()
  这⾥, 其实有shell语法错误, 因为调⽤⽅法时, 是不需要括号的"()", 因为这个语法错误, 所以这个脚本跑不了, 所以只需要将这个括号"()" 去掉就可以了
    test(){  echo "test shell script";  }
  test
  同样, 可能在其它情况下, 不满⾜shell脚本的语法要求的话, 也有很⼤可能会出现同样的情况,
  总结: 现在学的语⾔太多了, 各种语⾔之间有很多相似的地⽅, 上⾯代码会加括号, 就是因为写java, C语⾔写多了, 习惯了, 容易将各种语⾔之间的语法混淆, 以后要注意了~~~