关于shell脚本换行符问题

背景

最近有shell脚本发布报错,moia调度工具返回的内容截取如下

/home/agent/xxxx.sh: line 7: $'\r': command not found
/home/agent/xxxx.sh: line 13: $'\r': command not found
/home/agent/xxxx.sh: line 16: $'\r': command not found
/home/agent/xxxx.sh: line 20: $'\r': command not found
/home/agent/xxxx.sh: line 48: syntax error near unexpected token `$'\r''
/home/agent/xxxx.sh: line 48: `    if(($loopTimes==50))

实际上是空行报错了。

报错原因

先了解一下,文本文件的换行符,shell脚本本身就是文本文件

  • 回车换行(CRLF)
  • 回车(CR) 早期的Mac OS,常用
  • 换行(LF)

如何区分换行符?

  1. windows下 vscode 、 notepad++ 的默认换行符就是CRLF ,从右下角就能观察到
  2. Linux下 vi/vim 的默认换行符是LF,通过file命令可以观察到

报错原因如下:

moia 调度,实际上就是使用sh命令运行脚本,发现换行符是CRLF,会拆分成CR 和LF ,LF是换行 CR作为命令执行,报 command not found,而实际上报错的行是空行,换行符是CRLF。

推荐流程

文本文件上线前后检查如下内容:

  1. 文本本身的内容
  2. 字符集
  3. 换行符
  4. 测试环境和生产环境的LANG变量是否相同

推荐开发流程

  1. 开发前先探查服务器已有脚本的字符集、换行符等
  2. 如不一致可以使用UE、notepad++或vscode之类的文本编辑器进行转换。
posted on 2022-12-14 10:51  我是一只胖子  阅读(1961)  评论(0编辑  收藏  举报