栏目头部广告

Windows DOS格式脚本和Linux Unix格式脚本差异导致的跨平台问题

一、DOS格式和Unix格式介绍

DOS格式和Unix格式是两种不同的文本文件格式,它们在行结束符(line ending)上有显著的区别。这些差异源于不同的操作系统历史和设计哲学。

1.1 DOS格式(也称为Windows格式)

DOS格式文本文件使用特定的字符序列来表示行结束。在DOS、Windows以及许多其他早期的操作系统(如CP/M)中,行结束符由两个字符组成:回车(Carriage Return, CR)和换行(Line Feed, LF)。在ASCII编码中,回车对应的字符是\r(十进制值为13),换行对应的字符是\n(十进制值为10)。因此,DOS格式的行结束符通常表示为\r\n。

特点:

  • 行结束符是\r\n。
  • 在Windows系统中广泛使用,包括在Windows记事本等文本编辑器中。

1.2 Unix格式(也称为Linux格式、Mac格式(较新的Mac OS))

Unix格式的文本文件使用单一的换行(Line Feed, LF)字符来表示行结束。这种格式更为简洁,是Unix、Linux以及较新的Mac OS版本(从Mac OS X开始)的标准行结束方式。

特点:

  • 行结束符是\n。
  • 在Unix、Linux、Mac OS X及以后版本的Mac操作系统中使用。

二、问题复现

2.1 报错场景1

Windows下编辑的脚本,上传Linux环境执行。

[root@test ~]# ./cleanup-backup.sh 
-bash: ./cleanup-backup.sh: /bin/bash^M: bad interpreter: No such file or directory

2.2 报错场景2

[root@test ~]# ./myScript.sh 
./myScript.sh: line 41: syntax error: unexpected end of file

三、解决方案

3.1 转换方式1:在Linux中,用vim打开脚本

[root@test ~]# vim cleanup-backup.sh 

(1)用 :set ff 可查看文件格式

image.png

回车可以看到

image.png

(2)用 :set ff=unix 可设置文件格式为unix

image.png

回车可以看到

image.png

3.2 转换方式2:在Linux中,用dos2unix工具转换

[root@test ~]# yum -y install dos2unix
[root@test ~]# dos2unix cleanup-backup.sh
dos2unix: converting file cleanup-backup.sh to Unix format ...

四、快速检查脚本是否有语法错误

# 命令有输出则是有语法错误
[root@test ~]# sh -n myScript.sh

注:用"-n" 选项只会读取shell脚本,用于测试shell脚本是否存在语法错误,但不会实际执行脚本。

作者:UStarGao
链接:https://www.starcto.com/systemtool/331.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

UCloud云平台推荐


UCloud新用户专属注册连接

UCloud CDN超值特惠专场

UCloud全球云主机(UHost/VPS)大促页面

UCloud快杰云主机大促页面

文章页广告

随便看看

栏目底部广告
`