作者:Gakki
問題描述
- 在 Windows 下編寫好 Shell 腳本之后放到 Linux 上運行報錯宋下,如:
line 4 $' r' command not found
問題原因
- 出現(xiàn)這樣的錯誤,是因為 Shell 腳本在 Windows 系統(tǒng)編寫時薄翅,每行結(jié)尾是 “<換行><回車>”芝雪,即 \n\r 千元;在 Unix 體系中每行結(jié)尾只有“<換行>”,即 \n 卓囚,所以在 Unix 體系中運行腳本時,會認(rèn)為 \r 是一個字符站蝠,導(dǎo)致運行錯誤汰具。
解決方案
就是將 Shell 腳本中的 \r 字符去除掉。
方法一:
- 使用 sed 命令:
sed -i 's/\r//' 腳本名
- 解釋命令:
- sed:可依照腳本的指令來處理沉衣、編輯文本文件郁副。主要用來自動編輯一個或多個文件、簡化對文件的反復(fù)操作豌习、編寫轉(zhuǎn)換程序等存谎。
- i:會直接修改源文件,要慎用肥隆。
- sed s 替換腳本命令既荚,命令的基本格式為:
[address]s/pattern/replacement/flags
- address:指定要操作的具體行;
- pattern:指的是需要替換的內(nèi)容;
- replacement:指的是要替換的新內(nèi)容栋艳。
- flags 常用標(biāo)記:
flags 標(biāo)記 | 功能 |
---|---|
n | 1~512 之間的數(shù)字恰聘,表示指定要替換的字符串出現(xiàn)第幾次時才進(jìn)行替換。例如吸占,一行中有 3 個 A晴叨,但用戶只想替換第二個 A,這是就用到這個標(biāo)記矾屯; |
g | 對數(shù)據(jù)中所有匹配到的內(nèi)容進(jìn)行替換兼蕊,如果沒有 g,則只會在第一次匹配成功時做替換操作件蚕。例如孙技,一行數(shù)據(jù)中有 3 個 A,則只會替換第一個 A排作; |
p | 會打印與替換命令中指定的模式匹配的行牵啦。此標(biāo)記通常與 -n 選項一起使用。 |
w file | 將匹配后的結(jié)果保存指定的 file 文件中妄痪; |
& | 用正則表達(dá)式匹配的內(nèi)容進(jìn)行替換哈雏; |
\n | 匹配第 n 個子串,該子串之前在 pattern 中用 () 指定衫生。 |
\ | 轉(zhuǎn)義(轉(zhuǎn)義替換部分包含:&僧著、\ 等) |
如:
-
sed 's/test/trial/2' test.txt
:sed 編輯器只替換每行中第 2 次出現(xiàn)的匹配模式。數(shù)字 2 作為標(biāo)記的結(jié)果障簿。 -
sed 's/test/trial/g' test.txt
:替換所有匹配的字符串。
方法二:
- 使用命令即刻:
dos2unix one-more.sh
- 報錯:
-bash: dos2unix: command not found
- 說明dos2unix還沒有安裝栅迄,運行如下命令進(jìn)行安裝:
yum install -y dos2unix
其他
- 也可以將文件內(nèi)容打印出來站故,這樣更能直觀的發(fā)現(xiàn)問題。
- 在終端運行該命令:
python3 -c "import json; print(json.dumps([{'length': len(line), 'content': line} for line in open('test.sh')], indent=4))"
注:將 test.sh 改為自己的路徑與文件名即可。
打印結(jié)果
打印結(jié)果
- 我們可以從中發(fā)現(xiàn)西篓,cat 沒有將換行符打印出來愈腾,不好發(fā)現(xiàn)問題。但通過運行 python 命令岂津,就很直觀的發(fā)現(xiàn)問題虱黄。