Windows 和 Unix 的换行符

核心差异

早期的电传打字机需要同时执行「回车」(将打印头移到行首)和「换行」(将纸张下移一行)两个操作,因此用 \r\n 表示换行。计算机出现后,不同系统出于存储空间和兼容性考虑选择了不同方式:

  • Windows:\r\n (CR+LF),与早期 DOS 系统兼容。
  • Unix:仅用 \n (LF),以简化操作并节省存储空间。

Note:ASCII 编码中,\r 对应十进制 13,\n 对应十进制的 10。

跨平台的兼容性问题

文件显示异常

Windows 文件在 Unix 中打开时,行尾会显示 ^M 符号,即 \r

[why@yingzai shell]$cat -A for.sh
#!/bin/bash^M$
^M$
for nu in $(seq 1 5)^M$
do^M$
^Iecho -e "$nu"^M$
done^M$

脚本执行异常

比如,Shell 脚本执行时,会报错:

[why@yingzai shell]$sh for.sh
for.sh: line 2: $'\r': command not found
for.sh: line 4: syntax error near unexpected token `$'do\r''
'or.sh: line 4: `do

解决方法

手动转换

  • Linux 命令

    dnf install -y unix2dos
    dnf install -y dos2unix
    ...
    unix2dos filename
    dos2unix filename
    
  • 将换行符替换为空

    # VIM 设置
    set ff=unix
    # 命令行替换
    sed -i 's/\r//g' for.sh
    

其他工具

一般,编辑器和 IDE 会自动适配系统的换行符,或者通过文本编辑器手动替换。