編寫shell腳本時,我們經常習慣在windows下寫好,然後通過共用目錄拷到linux下,方便快捷。
杯具的事也來了,當我們在windows寫一個shell程式拷到linux中,修改好許可權,正準備試下效果時,

/bin/bash^M: 壞的解釋器: 沒有那個檔或目錄

ziyuan

什麼情況?
這跟系統有關。腳本檔在windows下編輯過,windows下每一行的結尾是\n\r,而在linux下檔的結尾是\n,那麼你在windows下編輯過的檔在linux下打開看的時候每一行的結尾就會多出來一個字元\r,
cat -A filename時你可以看到這個\r字元被顯示為^M

#!/bin/sh^M$
^M$
/usr/sbin/logrotate  /etc/logrotate.conf^M$
EXITVALUE=$?^M$
if [ $EXITVALUE != 0 ]; then^M$
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"^M$
fi^M$
exit 0^M$ 

PS:cat -A 什麼意思?
A就是all的意思,就是所有的都顯示出現,也就是說\n\r默認是不顯示的。
這時候只需要刪除這個字元就可以了。
怎麼刪掉呢?
正則運算式sed -i 's/\r$//'filename
什麼意思呢?
-i插入
s替代模式
\r$表示任何以\r結束的字元
整句意思是把以\r結束的字元換成空白

現在再運行就沒這個問題了。