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 会自动适配系统的换行符,或者通过文本编辑器手动替换。