天天看點

shell腳本報錯:-bash: test.sh: /bin/bash^M: bad interpreter: No such file or directory

原因分析

這主要是因為shell腳本是dos格式(腳本是在window系統下編輯的),而Linux運作的腳本需要時unix格式。

原來是unix系統和dos系統檔案存儲格式不一樣。

回想計算機的史前史,那時的打字機使用兩個字元來開始一個新行。首先是一個字元指令使列印頭移回開始位置(回車),然後另一個字元指令控制向前進紙一行(進紙).在計算機誕生之初,儲存設備十分昂貴。于是有人就提出沒有必要用兩個字元來表示一行的結束。UNIX一族決定隻用一個字元來表示行尾。來自蘋果陣營的人則把回車作為換行的标準。MS-DOS(和微軟的Windows)仍然決定沿用古老的回車換行傳統。即:DOS/Windows和Linux/Unix的檔案換行回車格式不同,基于 DOS/Windows 的文本檔案在每一行末尾有一個回車和換行,而 UNIX 文本隻有一個換行。

解決方法

檢視腳本檔案是dos格式還是unix格式的幾種辦法。

(1)

cat -A filename

從顯示結果可以判斷,dos格式的檔案行尾為^M$,unix格式的檔案行尾為 $;

(2)

vim filename

打開檔案,輸入并執行

set ff

,如果檔案為dos格式則顯示為

fileformat=dos

,如果是unxi則顯示為

fileformat=unix

解決辦法:

(1)使用linux指令

dos2unix filename

,直接把檔案轉換為unix格式;

(2)使用sed指令

sed -i "s/\r//" filename

或者

sed -i "s/^M//" filename

直接替換結尾符為unix格式;^M等于ctrl+v和ctrl+m。

(3)vim filename打開檔案,輸入并執行

set ff=unix

設定檔案為unix,然後執行:wq,儲存成unix格式。

繼續閱讀