Windows用Notepad++编辑Shell脚本:一招解决Linux执行报错问题

Windows用Notepad++编辑Shell脚本:一招解决Linux执行报错问题

Windows用Notepad++编辑Shell脚本:一招解决Linux执行报错问题

如果你经常在Windows上用Notepad++编辑Shell脚本,再上传到Linux服务器执行,大概率遇到过这样的报错:$'\r': command not foundsyntax 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格式

  1. 点击Notepad++顶部菜单栏的 「编辑(Edit)」
  2. 在下拉菜单中找到 「文档格式转换(EOL Conversion)」,鼠标悬停会展开子菜单;
  3. 点击子菜单中的 「Unix (LF)」,完成格式转换。

转换后,底部状态栏会从 Windows (CR LF) 变成 Unix (LF),表示所有 CRLF 换行符已替换为 LF

步骤3:保存文件(关键!)

转换格式后,一定要按 Ctrl+S 保存文件------若不保存,格式修改不会生效,上传到Linux后依然会报错。

保存完成后,再把脚本上传到Linux服务器,执行 sh test.sh 就能正常运行,之前的报错会彻底消失。

三、进阶技巧:设置默认保存为Linux格式(一劳永逸)

如果每次编辑Shell脚本都要手动转换格式,难免会忘记。这时可以设置Notepad++的"默认换行符格式",让新建的文件直接使用 Unix (LF),从根源避免问题。

具体步骤如下:

  1. 打开Notepad++,点击顶部菜单栏的 「设置(Settings)」
  2. 在下拉菜单中选择 「首选项(Preferences)」,弹出设置窗口;
  3. 在左侧列表中找到并点击 「新建」 选项;
  4. 在右侧"格式(Format)"区域,勾选 「Unix (LF)」(默认是"Windows (CR LF)");
  5. 点击窗口底部的 「关闭」,保存设置。

设置完成后,以后用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执行报错,本质是"换行符格式不兼容"导致的小问题,解决起来非常简单:

  1. 临时处理:打开文件后,通过「编辑→文档格式转换→Unix (LF)」转换格式,保存后上传;
  2. 永久解决:设置Notepad++默认新建文件为「Unix (LF)」格式,一劳永逸。

若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/153047655

相关推荐
哈里谢顿3 小时前
使用kvm创建一台虚拟机
linux
hanyi_qwe4 小时前
文本三剑客--awk
linux·运维·服务器
Caven774 小时前
【Linux 技巧】如何在登录时自动激活 Conda Base 环境
linux·运维·conda
凌寒114 小时前
Linux(Debian)安装、卸载 MySQL
linux·运维·mysql·debian
IT小哥哥呀5 小时前
如何从 Windows SSH 进入 VirtualBox Ubuntu 虚拟机——密码认证(逐步指南)
linux·windows·ubuntu·ssh·教程·虚拟机
XI锐真的烦5 小时前
Flutter Windows 下“Running Gradle task ‘assembleDebug‘...” 卡住一整天的终极解决办法
windows·flutter
怀旧,5 小时前
【Linux系统编程】7. 进程的概念(上)
linux·运维·服务器
7***n756 小时前
API网关设计模式
linux·服务器·设计模式
哈里谢顿7 小时前
环境变量 HTTP_PROXY/HTTPS_PROXY 深度解析:为什么 cURL 行,Docker 不行?
linux
馨谙7 小时前
使用 systemd 用户服务管理容器:从概念到实践
linux·容器