1.问题 /bin/bash^M

在Linux下执行shell脚本时出现以下问题:

  1. /bin/bash^Mbad interpreter: No such file or directory

问题发生的背景常常是我们将windows下写好的shell脚本拷贝到Linux去执行

2.原因

实际上,Windows/DOS下脚本文件每行是以\r\n作为行终止符的,而Unix系统通常是以\n作为行终止符。所以Linux下的bash在解析我们从windows上拷贝过去的脚本文件时,识别不了多出来的\r(在Linux上终端显示出来就是^M)。
在 Linux终端下下我们可以执行命令 cat -v来看到脚本文件中的^M

cat -v myscript.sh

3.解决办法

这里有3种方法可以解决这个问题

1.办法一 :set ff=unix

用vi或vim打开进入到这个脚本文件中,然后设置其文件格式为unix风格

注意:进入vim执行任何命令前,最好先按一下Esc
:set ff   //查看当前文件的风格
:set ff=unix   //设置当前文件风格为unix
:wq  //保存并退出

2.办法二 tr -d ‘\r’

使用tr命令删除字符 \r

tr -d '\r' < myscript.sh

参数解释: -d, —delete:删除指令字符 < 输入重定向,这里把我们的脚本文件作为输入源

3.办法三 sed -i

通过sed命令与正则的配合将行尾的\r替换为空:

sed -i 's/\r$//' xxx.sh

参数解释: 命令格式:sed ‘s/要被取代的字串/新的字串’ -i 直接修改读取的文件内容,而不是输出到终端

s 取代命令

$表示位于行尾