在linux下執行shell指令碼時會出現 M的問題

2021-10-25 13:55:34 字數 1495 閱讀 8839

我是在win10下編輯的乙個shell指令碼,傳到伺服器上去後執行出錯,用vi進去後發現每一行後面多乙個^m,估計是win下和linux下換行符編碼不一樣導致的用網上說的set ff=uinx什麼的方法好像沒用

後來用下面這個解決問題

sed -i 's/\r$//' filename

sed 's/old/new/g』 ***

sed -i 's/\r$//'       filename

解釋:

使用方法:sed 引數 '動作du' 動作物件

如果用-i引數將修改文件的內容,

sed 's/\//\\\//g'這個我舉乙個類似的分析。

sed 's/old/new/g』 ***

這個就是把***文件裡面的old這個詞換成new這個詞。

你的sed 's/\//\\\//g'裡面既是把,/換成\/。

s/\//是一部分,/\\\//g又是一部分,s後面的//之間就是要替換的詞語和上面的old類似,由於/有特殊定義,所以用\轉意成普通符號/,

/\\\//g從第一符號到g前面的/之間就為替換old的new,為\\/前面兩個\就是\沒有特殊意義所以為\\,後面g前面的第二個/由於有特殊意義所以用\來轉意,

所以new為\\/。在s/old/new/g裡面的/為固定格式所需要的,所以想列印出/來的話,要用\來轉意,linux特殊字元轉意都用\。

為什麼出現 ^m?

在vim中解決這個問題,很簡單,在vim中利用替換功能就可以將「^m」都乾掉,鍵入如下替換命令列:

1)vi -b setup.sh

注意:上述命令列中的「^m」符,不是「^」再加上「m」,而是由「ctrl+v」、「ctrl+m」鍵生成的。

這樣替換掉以後,儲存就可以執行了。當然還有其他的替換方式比如:

a.一些linux版本有 dos2unix 程式,可以用來祛除^m。

b.cat filename1 | tr -d 「\r」 > newfile 去掉^m生成乙個新檔案,還有sed命令等,凡是可以替換的命令都是可以用來新生成乙個檔案的。

當執行在windows系統下修改過的指令碼時,會提示存在^m的錯誤,但是在linux下直接使用vim開啟並不存在。此時可以使用vim -b來開啟指令碼檔案,就可以發現每行的末尾都存在^m。

造成這樣的原因是不同的系統使用了不同的換行符。在windows下文字檔案的每一行結尾都有乙個回車(『\n『)和換行符(『\r『);在linux下文字檔案的每一行結尾都有乙個回車(『\n『);在mac下文字檔案的每一行結尾都有乙個換行符(『\r『)。

所以,當在linux使用vim開啟windows編輯過的指令碼時,^m代表的就是換行符(『\r『)。

解決辦法也很簡單就是使用vim -b開啟指令碼檔案,然後使用在互動模式下輸入替換命令:%s/^m//g(注意:^m是由+和+打出來的),最後在互動模式下輸入儲存退出命令:wq即可。

部署在tocmat的程式執行shell指令碼

1 需要把shell指令碼放在resources目錄下。如shell.sh 2需要在tomcat裡面定位到當前shell的目錄,不要定位到了tomcat的目錄裡面去 定位 string path1 thread.currentthread getcontextclassloader getresou...

linux下mysql冷備份shell指令碼

usr bin env bash 資料庫基礎資訊 db host 127.0.0.1 本機 db name 1 要備份的庫名 db user root 使用者名稱 db pass root 密碼 date date y m d h m s mysql path data mysql bak 備份路徑...

在linux環境下自動執行python指令碼

usr bin env python coding utf 8 import sys import os import re 假設hive資料檔案以日期為分割槽。for i in range 0,92 if i 31 date 20160801 i elif i 61 date 20160901 i...