当相同的代码在别处工作时,为什么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 yourscript
或cat yourscript | tr -d '\r' > fixedscript
从命令行删除它们 cat yourscript | tr -d '\r' > fixedscript
。
为什么回车会导致语法错误?
回车符只是另一个字符。 then
是不一样的then\r
,所以bash不认为它是一个关键字,并假定它是一个命令。 然后它继续寻找一个then
失败
如果在那之后碰巧有一个尾随的空间, then
你会遇到类似的问题。