背景
最近有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)
如何区分换行符?
- windows下 vscode 、 notepad++ 的默认换行符就是CRLF ,从右下角就能观察到
- Linux下 vi/vim 的默认换行符是LF,通过file命令可以观察到
报错原因如下:
moia 调度,实际上就是使用sh命令运行脚本,发现换行符是CRLF,会拆分成CR 和LF ,LF是换行 CR作为命令执行,报 command not found,而实际上报错的行是空行,换行符是CRLF。
推荐流程
文本文件上线前后检查如下内容:
- 文本本身的内容
- 字符集
- 换行符
- 测试环境和生产环境的LANG变量是否相同
推荐开发流程
- 开发前先探查服务器已有脚本的字符集、换行符等
- 如不一致可以使用UE、notepad++或vscode之类的文本编辑器进行转换。