1. 程式人生 > >執行shell腳本報-bash: ./test.sh: /bin/bash^M: 壞的解釋器

執行shell腳本報-bash: ./test.sh: /bin/bash^M: 壞的解釋器

shell /bin/bash bad interpreter

問題描述:

在notepad++裏面編輯修改了shell腳本,再上傳到服務器執行,出現“-bash: ./test.sh: /bin/bash^M: 壞的解釋器: 沒有那個文件或目錄”的報錯:

[root@test102 ~]# ./test.sh 
-bash: ./test.sh: /bin/bash^M: 壞的解釋器: 沒有那個文件或目錄
[root@test102 ~]# 

原因分析:

這個問題可能是因為腳本文件在windows下編輯過。就有可能被轉換成Windows下的dos文本格式了,這樣的格式每一行的末尾都是以\r\n來標識,它的ASCII碼分別是0x0D,0x0A。如果你將這個腳本文件直接放到Linux上執行就會報/bin/bash^M: bad interpreter錯誤提示。

windows下,每一行的結尾是\n\r,而在linux下文件的結尾是\n,
那麽你在windows下編輯過的文件在linux下打開看的時候每一行的結尾就會多出來一個字符\r。
用cat -A file.sh時你可以看到這個\r字符被顯示為^M,這時候只需要刪除這個字符就可以了。
可以使用命令sed -i ‘s#\r$##g‘ file.sh 。

======================================================================================

解決方法1——修改換行符:

1、查看腳本文件的換行符,果然是多個^M:

[root@test102 ~]# cat -A test.sh 
#!/bin/bash^M$
   touch /home/test1^M$
   echo "test1" >>/home/test1^M$
   echo "test2" >>/home/test1^M$
   ^M$
   [root@test102 ~]#

2、替換換行符:

[root@test102 ~]# sed -i ‘s#\r$##g‘ test.sh 

3、檢查修改後的文件,換行符已經替換OK,換行符已經是$了:

[root@test102 ~]# cat -A test.sh 
#!/bin/bash$
   touch /home/test1$
   echo "test1" >>/home/test1$
   echo "test1" >>/home/test1$
   $
[root@test102 ~]# 

4、執行腳本,OK了

[root@test102 ~]# ./test.sh 
[root@test102 ~]# 
[root@test102 ~]# cat /home/test1 
test1
test1
[root@test102 ~]# 

註意:
最然使用cat -A看到的換行符是^M$,但是在替換換行符的時候不能用 sed -i ‘s#\^M$##g‘ test.sh 來替換,替換不成功的:

[root@test102 ~]# sed -i ‘s#\^M$##g‘ test.sh 
[root@test102 ~]# 
[root@test102 ~]# 
[root@test102 ~]# ./test.sh 
-bash: ./test.sh: /bin/bash^M: 壞的解釋器: 沒有那個文件或目錄   #同樣無法執行
[root@test102 ~]# 
[root@test102 ~]# 
[root@test102 ~]# cat -A test.sh          #cat -A查看文件會發現文件換行符其實沒有改成功的
#!/bin/bash^M$
   touch /home/test1^M$
   echo "test1" >>/home/test1^M$
   echo "test1" >>/home/test1^M$
   ^M$
[root@test102 ~]# 
[root@test102 ~]# 

解決方法2——修改文本格式:

用vim命令打開要檢查的腳本文件,然後用
:set ff?
命令檢查一下,看看是不是dos字樣,如果是dos格式的,繼續執行
:set ff=unix
然後執行
:qw
保存退出即可:

執行結果發現文本格式真的是dos的格式:
技術分享圖片

技術分享圖片

然後用命令:set ff=unix修改:
技術分享圖片

修改之後格式變成了unix:
技術分享圖片

然後保存退出,執行腳本就OK了:

[root@test102 ~]# ./test.sh 
[root@test102 ~]# 
[root@test102 ~]# 
[root@test102 ~]# cat /home/test1 
test1
test1
[root@test102 ~]# 

解決方法3——轉碼後上傳:

後來在notepad++裏面找了一下,發現用notepad++編輯的話,編輯完了之後檢查一下格式,轉成UNIX格式之後保存,上傳到服務器運行就好啦。
技術分享圖片

解決方法參考:
https://www.cnblogs.com/orez88/articles/2016009.html
https://www.cnblogs.com/vijayfly/p/6232427.html

執行shell腳本報-bash: ./test.sh: /bin/bash^M: 壞的解釋器