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 小时前
交叉编译:strip: Unable to recognise the format of the input file xx.c.o
linux·运维·服务器
六六六六六66663 小时前
Ubuntu22.04安装Ibus的中文输入法
linux
Le1Yu4 小时前
微服务拆分以及注册中心
linux·运维·服务器
code_ing-4 小时前
【Linux】Linux基本指令
linux·笔记
zzzsde4 小时前
【Linux】linux基础指令入门(1)
linux·运维·学习
uxiang_blog5 小时前
Linux下如何在vim里使用异步编译和运行?
linux·vim·asynctasks.vim·asyncrun.vim
leellun5 小时前
在Centos上安装Python指定版本
linux·运维·centos
C嘎嘎嵌入式开发5 小时前
(13)100天python从入门到拿捏《目录操作》
windows·python·microsoft
用户31187945592185 小时前
CentOS 7 安装 bzip2-libs-1.0.6-13.el7.x86_64.rpm 的详细步骤
linux