Dos与Linux的换行符
写shell脚本的时候经常会出现这个问题,我们在win下编写的shell脚本,放在linux下报语法错误,但是着实看不出哪里有问题,我们以以下的shell脚本为例,我们新建一个notepad++实例,输入以下命令
#!/bin/sh
if [ $# -lt 1 ] ; then
echo "未检测到输入参数,退出!"
exit 1
fi
保存为 test.sh
赋予执行权限并执行
发现报错了,但是我们直接在linux下编辑同样的内容却是可以执行通过的
那么,问题来了,同样的内容,为什么一会儿报错,一会儿又执行通过了呢?
这里根本原因是编码的问题,因为windows的默认编码是GBK,而Linux的默认编码是UTF-8,所以windows换行符是 \r\n,而在Linux换行符是 \n,这样windows的换行符在Linux下就不会被正确识别,我们可以做个试验
查看直接从windows下复制过来的文件
查看直接在linux编写的文件
我们发现,windows复制过来的会有^M,符号其实这个就是换行符 \r,从而导致linux不识别无法编译
那么,我们如何去掉这个换行符呢?
这里提供几个方法
- Notepad++自带的转换工具
编辑à文档格式转换à转换为unix
- Linux后台转换(sed)
sed -i ‘s/^M//g’ test.sh
(注意:这里^M不是通过上档键敲出来的,而是 ctrl+v ctrl enter敲出来,后续命令行中的^M都是这样),这个命令直接粘贴过去可能无法使用,请粘贴到linux后台,并将单引号替换为linux下的英文单引号,并按操作替换^M,当然替换为 \r 或是 \015 效果也是一样的,下同
- Linux后台转换(tr)
cat test.sh |tr -d ^M > tmp ; mv tmp test.sh
这个其实是两个命令,暂时还没有想好怎么合并为一个命令,后续会慢慢优化