当相同的代码在别处工作时,为什么shell脚本会出现语法错误?

我有一个简单的shell脚本,我从一个工作脚本中复制。 如果我将其复制粘贴到terminal,它将起作用:

if true then true fi 

然而,当我用bash myscript运行脚本时,我得到各种语法错误,就好像一些关键字丢失一样。

  • myscript: line 4: syntax error near unexpected token `fi' ,就好像then不存在。
  • myscript: line 6: syntax error: unexpected end of file ,就好像fi不存在一样。
  • myscript: line 4: syntax error near unexpected token `$'\r' ..什么?

为什么在这个特定的脚本中发生这种情况,而不是在我的命令行或从我复制的脚本中?

TL; DR:您的脚本具有Windows样式的CRLF行结尾,又名\r\n

通过删除回车符转换为Unix样式。


如何检查我的脚本是否有回车?

它们在cat -v yourscript的输出中可检测为^M

 $ cat -v myscript if true^M then^M true^M ... 

我如何删除它们?

设置你的编辑器来保存Unix行结尾的文件,也就是“行结束符”或者“行结束符”,然后重新保存。

您也可以使用dos2unix yourscriptcat yourscript | tr -d '\r' > fixedscript从命令行删除它们 cat yourscript | tr -d '\r' > fixedscript

为什么回车会导致语法错误?

回车符只是另一个字符。 then是不一样的then\r ,所以bash不认为它是一个关键字,并假定它是一个命令。 然后它继续寻找一个then失败

如果在那之后碰巧有一个尾随的空间, then你会遇到类似的问题。