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命令即可。


免責聲明!

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



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