根本原因是Windows与Linux换行符不兼容:Windows用\r\n,Linux只认\n,多余\r被shell误作命令名导致“command not found”;解决核心是去除\r或统一为LF,常用方法为sed -i 's/\r$//' script.sh。

Windows 编写的 Shell 脚本在 Linux 上执行报错,比如 $'\r': command not found 或 bad interpreter: No such file or directory,根本原因是换行符不兼容:Windows 用 \r\n(CRLF),Linux 只认 \n(LF)。多出来的 \r 被 shell 当作命令名的一部分,自然“找不到命令”。解决核心就一条:把 \r 去掉或统一为 LF。
快速识别是否是换行问题
运行以下命令检查脚本格式:
-
file your_script.sh—— 若显示with CRLF line terminators,就是 Windows 格式 -
cat -A your_script.sh—— 若每行末尾看到^M$,说明有\r -
vim your_script.sh后输入:set ff—— 显示fileformat=dos即为问题根源
推荐的终端内修复方法
无需额外工具,Linux 自带命令就能处理:
-
sed -i 's/\r$//' your_script.sh—— 最常用、最稳妥,只删行尾的\r -
dos2unix your_script.sh—— 更语义清晰,需先安装:sudo apt install dos2unix(Ubuntu/Debian)或sudo yum install dos2unix(CentOS/RHEL) -
vim your_script.sh→ 输入:set ff=unix→:wq—— 适合顺手编辑时一并修正
预防下次再出问题
与其事后修复,不如从源头避免:
- 用 VS Code 编写脚本时,在右下角状态栏点击换行符标识(如
CRLF),选LF;或设置中搜索files.eol,设为\n - 用 Notepad++ 的话,菜单栏 → Edit → EOL Conversion → Unix (LF)
- 直接在 Linux 环境写(如用
vim、nano),或通过 WSL / Git Bash 编辑,天然生成 LF 格式
注意两个常见连带错误
换行问题常和另外两个低级错误同时出现,排查时别漏掉:
-
Shebang 路径写错:比如写成
#!bin/bash(缺开头的/),应为#!/bin/bash -
脚本无执行权限:上传后运行前记得
chmod +x your_script.sh


















