我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解Shell脚本中^M的问题和解决方案

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解Shell脚本中^M的问题和解决方案

目录
  • ^M 是什么?
  • 本质原因
  • 常用工具

在开发过程中,有时候不小心将Windows本地创建的shell脚本(以 .sh 结尾的脚本),传到linux系统中,通过 vi或者view命令查看文件时,发现在末尾发现出现了很多^M字符。

^M 是什么?

这个字符就是换行符。是由于跨平台解析的原因。
因为window和Linux下对行尾的换行的定义不同
Windows: \r\n
Linux/Unix: n
Mac: \r

例子

详解Shell脚本中^M的问题和解决方案

出现的原因:
在DOS/Windows里,文本文件的换行符为\r\n,而在nix系统里则为\n,所以DOS/Windows里编辑过的文本文件到了nix里,每一行都多了个^M

导致的问题:
脚本可能无法正常执行,影响程序正常使用

临时解决方案1:

如果需要从表面上修改,只需使用替换命令就能将该字符给取消;#:%s/^M//g

临时解决方案2:

在linux上创建一个文件,名称为 xxx.sh,将这个问价下载到本地,然后将脚本内容粘贴进去,重新上传到linux上打开查看。

补:解决方法

 如果需要转换,我们只需要转换文件格式即可。你可以选择直接在服务器上调整。包括如下三种方式。
(1)使用linux命令dos2unix filename,直接把文件转换为unix格式
(2)使用sed命令sed -i "s/\r//" filename  或者 sed -i "s/^M//" filename直接替换结尾符为unix格式
(3)vi filename打开文件,执行 : set ff=unix 设置文件为unix,然后执行:wq,保存成unix格式。

本质原因

跨平台造成的编码格式问题。其实这个是历史遗留问题,根本原因就是对换行符的内存组成问题。在unix操作系统下的换行符格式为0A(ascii码),而dos格式下的换行符为 0D 0A(也就是),其实就显示为^M了。并且对于这个原因,也是有历史的。
unix将换行符的字符形式给转变了,然而,dos命令下任然保留着传统的表达方式;所以以后在进行跨平台开发的时候,前提就是考虑是否兼容,是否编码格式兼容这些基本的前提条件。

历史来源:
早期的计算机输出设备不是显示器,而是电传打字机,结构与普通的打字机差不多。有一个打印头在纸上打字,同时有一个电动机控制纸张的进出。当打印头到达行尾的时候,需要两个动作才能够到达下一行的行首:首先执行回车动作,将打印头移动到本行的行首,然后进行换行动作,电动机将纸张向上移动一行,这样打印头就处于下一行的行首,可以继续进行打印。回车和换行对应的控制字符分别是\r和\n,这就是windows中换行符为\r\n的由来。后来由于经常连续执行,所以在打印机中将这两个控制字符简化为一个控制字符,这就是Linux/Unix中的换行符\n的由来。

常用工具

dos2unix 将window下文本文件转成符合Linux系统要求的文件
unix2dos  与上面的命令的作用相反

到此这篇关于详解Shell脚本中^M的问题和解决方案的文章就介绍到这了,更多相关Shell ^M问题内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解Shell脚本中^M的问题和解决方案

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解Shell脚本中^M的问题和解决方案

目录^M 是什么?本质原因常用工具在开发过程中,有时候不小心将Windows本地创建的shell脚本(以 .sh 结尾的脚本),传到linux系统中,通过 vi或者view命令查看文件时,发现在末尾发现出现了很多^M字符。 ^M 是什么?
2022-06-05

shell脚本返回值问题的解决

如果学习过高级语言比如java和c语言等,此时你要是获取一个函数的返回值,直接在函数里面写上return即可,然后在函数执行时将返回结果赋值给某个变量即可。但是在shell脚本中限制较多,因此如果我们想实现这样的功能的话,稍微困难一些,本人
2022-06-04

如何解决 shell 脚本重复执行的问题

简介flock 是文件锁命令,它可以保证linux系统上进程之间安全的访问临界资源,在shell脚本中,可以用来控制逻辑的互斥性 实例1现有脚本 a.sh, 内容如下#!/bin/bashecho "[`date +'%Y-%m-%d %H
2022-06-04

详解Shell脚本中调用另一个Shell脚本的三种方式

主要以下有几种方式:CommandExplanationfork新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 She
2022-06-04

详解shell脚本中的case条件语句介绍和使用案例

#前言:这篇我们接着写shell的另外一个条件语句case,上篇讲解了if条件语句。case条件语句我们常用于实现系统服务启动脚本等场景,case条件语句也相当于if条件语句多分支结构,多个选择,case看起来更规范和易读 #case条件语
2022-06-04

C++中代码性能问题及解决方案详解

C++中代码性能问题及解决方案详解导言:在软件开发过程中,性能问题一直是开发人员关注的焦点之一。尤其是在C++这样的高性能编程语言中,如何优化代码性能成为了开发者们必须面对的挑战。本文将讨论C++中常见的一些性能问题,并提供相应的解决方案及
2023-10-22

详解SimpleDateFormat的线程安全问题与解决方案

1. 原因SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日
2023-05-31

详解shell中脚本参数传递的两种方式

方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${10},${11}....才能获
2022-06-04

DoytoQuery中关于N+1查询问题解决方案详解

这篇文章主要为大家介绍了DoytoQuery中关于N+1查询问题解决方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-27

Shell中实现“多线程”执行脚本文件完美解决方案

即比如我有100个可执行文件,互相间没有特别的先后执行关系,如CODE:job_1job_2job_2.....job_100想用csh/bash来多线程调用执行。 比如一次开5个线程,那么job_1,2,3,4,5一起先开始,那么其中任何
2022-06-04

shell脚本5种执行方式及脚本不同的执行方法和区别详解

目录前言概述正题一、方式1绝对路径和方式2相对路径,可以归纳为同一种方法二、方式3使用 sh/bash命令来执行三、方式4使用 . (空格)脚本名称来执行四、方式5使用 source 来执行(主要用于生效配置文件)区别1.关于执行权限2.关
2022-07-19

C++中编译优化问题和解决方法的详解

C++中编译优化问题和解决方法的详解摘要:C++编译器优化是提高程序性能的重要手段。然而,在实际开发中,我们经常会遇到一些与编译优化相关的问题,比如编译器错误优化、代码性能下降等。本文将针对这些问题进行详细的解析,并提供相应的解决方法,以期
2023-10-22

C++中堆和栈问题的分析与解决方案

C++中堆和栈问题的分析与解决方案在C++编程中,堆和栈是两种常用的内存管理方式。堆用于动态分配内存,而栈则用于存储局部变量和函数调用的上下文信息。然而,错误的使用堆和栈可能导致内存泄漏、段错误和无法预料的行为。因此,在编写C++代码时需要
2023-10-22

编程热搜

目录