SHELL腳本“syntax error: unexpected end of file”解決方案[半原創]


目前發現運行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的時候,當你用如下命令:
vi dos.txt
: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語言寫多了, 習慣了, 容易將各種語言之間的語法混淆, 以后要注意了~~~

 

參考文章:http://smilejay.com/2011/08/unexpected-end-of-file/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM