Windows用Notepad++编辑Shell脚本:一招解决Linux执行报错问题
- Windows用Notepad++编辑Shell脚本:一招解决Linux执行报错问题
-
- 一、报错根源:Windows与Linux的"换行符之争"
- 二、核心解决步骤:Notepad++设置换行符
- 三、进阶技巧:设置默认保存为Linux格式(一劳永逸)
- 四、额外提醒:避免其他"跨系统编辑坑"
-
- [1. 编码格式:优先用UTF-8无BOM](#1. 编码格式:优先用UTF-8无BOM)
- [2. 避免用Windows自带记事本编辑](#2. 避免用Windows自带记事本编辑)
- 五、总结
Windows用Notepad++编辑Shell脚本:一招解决Linux执行报错问题
如果你经常在Windows上用Notepad++编辑Shell脚本,再上传到Linux服务器执行,大概率遇到过这样的报错:$'\r': command not found
、syntax error near unexpected token
。明明脚本代码逻辑没问题,却始终无法正常运行,就像下面这样:
- Shell 源码
shell
#!/bin/bash
function welcome() {
echo "=============="
echo "Welcome to Linux Shell"
echo "=============="
}
welcome
- 但是,执行报错:
shell
[Ruby@gaussdb01 tmp]$ sh test.sh
test.sh: line 2: $'\r': command not found
test.sh: line 3: $'\r': command not found
test.sh: line 4: syntax error near unexpected token `$'{\r''
'est.sh: line 4: `function welcome() {
[Ruby@gaussdb01 tmp]$

今天就彻底搞懂这个问题的根源,以及如何在Windows编辑时就提前解决,让Shell脚本从编辑到执行全程顺畅。
一、报错根源:Windows与Linux的"换行符之争"
先明确一个关键差异:不同系统对"换行"的表示方式不同。
- Windows系统:用
CRLF
(即\r\n
,回车+换行)作为文件换行符; - Linux/Unix系统:只认
LF
(即\n
,仅换行)作为换行符。
当你在Windows用Notepad++编辑Shell脚本时,默认会按Windows规则写入 CRLF
换行符。但把脚本上传到Linux后,Linux无法识别多余的 \r
(回车符),会把它当成无效字符处理:
- 多余的
\r
会被解析为$'\r'
,导致报错"$'\r': command not found
"; - 函数定义(如
function welcome() {
)末尾的\r
会破坏语法结构,引发"syntax error near unexpected token
"。
简单说:不是你的脚本代码错了,是换行符格式不兼容。只要在Windows编辑时,把换行符改成Linux兼容的格式,问题就能解决。
二、核心解决步骤:Notepad++设置换行符
Notepad++自带"换行符格式转换"功能,操作简单,分两步即可完成。
步骤1:查看当前文件的换行符格式
打开脚本文件后,先确认当前的换行符类型------Notepad++底部状态栏会直接显示:
- 若显示
Windows (CR LF)
:表示当前是Windows格式(这就是导致报错的"元凶"); - 若显示
Unix (LF)
:表示是Linux兼容格式(无需修改,可直接上传)。
比如你编辑的 test.sh
脚本,底部显示 Windows (CR LF)
,就说明需要转换格式。
步骤2:将换行符转换为Linux格式
- 点击Notepad++顶部菜单栏的 「编辑(Edit)」;
- 在下拉菜单中找到 「文档格式转换(EOL Conversion)」,鼠标悬停会展开子菜单;
- 点击子菜单中的 「Unix (LF)」,完成格式转换。
转换后,底部状态栏会从 Windows (CR LF)
变成 Unix (LF)
,表示所有 CRLF
换行符已替换为 LF
。
步骤3:保存文件(关键!)
转换格式后,一定要按 Ctrl+S
保存文件------若不保存,格式修改不会生效,上传到Linux后依然会报错。
保存完成后,再把脚本上传到Linux服务器,执行 sh test.sh
就能正常运行,之前的报错会彻底消失。
三、进阶技巧:设置默认保存为Linux格式(一劳永逸)
如果每次编辑Shell脚本都要手动转换格式,难免会忘记。这时可以设置Notepad++的"默认换行符格式",让新建的文件直接使用 Unix (LF)
,从根源避免问题。
具体步骤如下:
- 打开Notepad++,点击顶部菜单栏的 「设置(Settings)」;
- 在下拉菜单中选择 「首选项(Preferences)」,弹出设置窗口;
- 在左侧列表中找到并点击 「新建」 选项;
- 在右侧"格式(Format)"区域,勾选 「Unix (LF)」(默认是"Windows (CR LF)");
- 点击窗口底部的 「关闭」,保存设置。
设置完成后,以后用Notepad++新建的任何文件,都会默认使用Linux兼容的 LF
换行符。编辑Shell脚本时,无需再手动转换格式,直接编写、保存、上传即可正常执行。
四、额外提醒:避免其他"跨系统编辑坑"
除了换行符,Windows编辑Shell脚本还可能遇到其他兼容问题,这里顺便提两个常见场景,帮你全面避坑:
1. 编码格式:优先用UTF-8无BOM
Linux系统默认推荐UTF-8编码,若Notepad++保存的文件带"BOM"(字节顺序标记),可能导致脚本头部出现乱码,甚至执行报错。
设置方法:
- 「设置」→「首选项」→「新建」→「编码」,选择 「UTF-8(无BOM)」;
- 对已存在的文件,可通过「格式」→「转为UTF-8无BOM编码」进行转换。
2. 避免用Windows自带记事本编辑
很多人会随手用Windows记事本编辑脚本,但记事本不仅默认用 CRLF
换行符,还会强制给UTF-8文件加BOM,且无法修改格式。强烈建议放弃记事本,用Notepad++、VS Code等工具编辑Shell脚本,兼容性更好。
五、总结
Windows编辑Shell脚本后Linux执行报错,本质是"换行符格式不兼容"导致的小问题,解决起来非常简单:
- 临时处理:打开文件后,通过「编辑→文档格式转换→Unix (LF)」转换格式,保存后上传;
- 永久解决:设置Notepad++默认新建文件为「Unix (LF)」格式,一劳永逸。
若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/153047655