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 可查看文件格式
回车可以看到
(2)用 :set ff=unix 可设置文件格式为unix
回车可以看到
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云平台推荐
随便看看
- 2021-06-28Nginx文件下载服务器搭建
- 2021-07-21MySQL主从同步异常之从库误写数据
- 2022-03-24Redis二进制编译安装教程
- 2021-04-25MySQL数据库时区设置
- 2024-09-12UCloud Centos7.x高内核降级到低内核及内核crash参数调整