原因分析
這主要是因為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格式。