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

Why is a shell script giving syntax errors when the same code works elsewhere?

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
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 `$'
    '
    ..什么?

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


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

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

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

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

1
2
3
4
5
$ cat -v myscript
if true^M
then^M
  true^M
...

我该如何删除它们?

将编辑器设置为使用Unix行结尾保存文件,即"行终止符"或"行尾字符",然后重新保存。

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

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

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

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