首頁 > 軟體

syntax error near unexpected token 指令碼報錯誤解決

2020-06-16 17:12:54

向朋友要了一個Shell指令碼來在Linux試用,發現執行時就報錯:syntax error near unexpected token,仔細查詢了還是沒找到錯誤,後來發現指令碼內容每行尾行都新增了^M的字元,檢視方式:vi -b 開啟指令碼檔案

後來想了下,造成這個的原因應該是指令碼有試過拿到Win機器上存放,期間也用Win下的編輯器編輯過。

現在簡單整理如下:

使用vim -b命令檢視檔案內容如下:

每一行多了一個^M有木有?

那麼接下來就要搞清楚這個^M是什麼東東?

long long long ago .....  老式的電傳打字機使用兩個字元來另起新行。一個字元把滑動架移回首位 (稱為迴車,<CR>,ASCII碼為0D),另一個字元把紙上移一行 (稱為換行, <LF>,ASCII碼為0A)。當計算機問世以後,記憶體曾經非常昂貴。有些人就認定沒必要用兩個字元來表示行尾。UNIX 開發者決定他們可以用 一個字元來表示行尾,Linux沿襲Unix,也是<LF>。Apple 開發者規定了用<CR>。開發 MS-DOS以及Windows 的那些傢伙則決定沿用老式的<CR><LF>。

因為MS-DOS及Windows是迴車+換行來表示換行,因此在Linux下用Vim檢視在Windows下用VC寫的程式碼,行尾後的“^M”符號,表示的是換行符。

基本解決方法有三個:

1.用vim編輯器替換

vim -b filename

在命令模式下執行%s/^M//g進行替換

注意:上述命令列中的“^M”符,不是“^”再加上“M”,而是由“Ctrl+v”、“Ctrl+M”鍵生成的。

2.使用dos2unix命令進行轉換

Dos2unix在有些版本的系統中預設是安裝的。

在Linux中,文字檔案用"n"表示回車換行,而Windows用"rn"表示回車換行。所以在Linux中使用Windows的文字檔案常常會出現錯誤。為了避免這種錯誤,Linux提供了兩種文字格式相互轉化的命令:dos2unix和unix2dos,dos2unix把"rn"轉化成"n",unix2dos把"n"轉化成"rn"。

命令dos2unix和unix2dos的使用非常簡單,格式為:dos2unix filename

如果想了解更多,可以檢視手冊。man dos2unix

3.使用文字處理工具

cat filename | tr -d "/r" > newfile 去掉^M生成一個新檔案。

同樣還有sed命令等,凡是可以替換的命令都是可以用來新生成一個檔案的。

另外,在上傳到Linux平台過程中,可以選擇上傳型別為二進位制,也可以避免此問題,大家可以試一下

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-06/144756.htm


IT145.com E-mail:sddin#qq.com