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

相关推荐
徐子元竟然被占了!!4 小时前
Linux-systemctl
linux·数据库·oracle
_w_z_j_7 小时前
Linux----mmap
linux
程序员zgh8 小时前
Linux系统常用命令集合
linux·运维·服务器·c语言·开发语言·c++
Bigan(安)9 小时前
【奶茶Beta专项】【LVGL9.4源码分析】09-core-obj_class对象类系统
linux·c语言·mcu·arm·unix
紫郢剑侠9 小时前
飞秋@Windows +iptux@Linux,打造内网跨平台IM环境
linux·运维·服务器·im·qq
陈小于9 小时前
windows(x86-x64)下编译JCEF
windows
保持低旋律节奏9 小时前
linux——调试
linux·运维·服务器
牛奶咖啡139 小时前
Linux系统故障排查思路实践教程(下)
linux·运维·服务器·su命令切换用户问题解决·文件打开过多问题解决·linux网络故障问题解决·linux故障排查思路
coder4_10 小时前
Linux 数据同步全攻略:NFS 共享、inotify+rsync 与 sersync 实战指南
linux·rsync·文件共享·nfs·数据同步·inotify·实时备份
Lynnxiaowen10 小时前
今天我们继续学习kubernetes内容Helm
linux·学习·容器·kubernetes·云计算