今天在开发中遇到了 shell 脚本没法执行的情况,报错如下

1
-bash: ./xxx.sh: /bin/bash^M: bad interpreter: No such file or directory

经过排查,最终确认是 shell 脚本在 windows 上开发,使用 windows 的换行符 CRLF 导致的,换用 linux 的换行符 LF 之后可以正常使用。
原因是 .sh 默认是按照 Windows 下的 CRLF 做回车换行的,这个在 linux 下执行就会报错,要把回车换行改成 LF

在进行转换的时候使用了notepad++的替换功能。

notepad替换

或者在右下角进行更改

转Unix

或者在Linux终端下直接用下面的命令

1
sed -i 's/\r$//' xx.sh

原理解释:

1). Windows下换行符号是“\r\n”
回车符是 Carriage Return, C语言中是\r;换行符是 Line Feed, C语言中是\n;回车换行符实际是两个字符, 就是\r\n;
而 linux 下是\n没有\r,所以直接把/r去掉就可以了。