Linux系统下文档出现^M导致shell编译报错的解决办法

解决跨平台Shell脚本换行符问题
本文探讨了Windows与Linux环境下Shell脚本因换行符差异导致的执行错误,详细解释了Dos与Linux换行符的区别,并提供了Notepad++及Linux后台工具sed与tr的解决方案。

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不识别无法编译

那么,我们如何去掉这个换行符呢?

这里提供几个方法

  1. Notepad++自带的转换工具

编辑à文档格式转换à转换为unix

  1. Linux后台转换(sed)

sed -i ‘s/^M//g’ test.sh

(注意:这里^M不是通过上档键敲出来的,而是 ctrl+v ctrl enter敲出来,后续命令行中的^M都是这样),这个命令直接粘贴过去可能无法使用,请粘贴到linux后台,并将单引号替换为linux下的英文单引号,并按操作替换^M,当然替换为 \r 或是 \015 效果也是一样的,下同

  1. Linux后台转换(tr)

cat test.sh |tr -d ^M > tmp ; mv tmp test.sh

这个其实是两个命令,暂时还没有想好怎么合并为一个命令,后续会慢慢优化

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值