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

时间:2015-08-07 20:29:58

标签: bash shell sh carriage-return

我有一个从工作脚本复制的简单shell脚本。如果我将其复制粘贴到终端,它可以工作:

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' ..什么?

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

1 个答案:

答案 0 :(得分:14)

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

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

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

他们在^M的输出中可以cat -v yourscript检测到:

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

如何删除它们?

设置编辑器以使用Unix行结尾保存文件,又称"行终止符"或"行尾字符",并重新保存。

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

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

回车符只是bash的另一个字符。 thenthen\r不同,因此bash不会将其识别为关键字并假定它是一个命令。然后它继续寻找then并且失败

如果在then之后恰好有一个尾随空格,则fi会出现类似的问题。