我有一个从工作脚本复制的简单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'
..什么?为什么会在这个特定的脚本中发生这种情况,而不是在我的命令行或我复制的脚本中?
答案 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 yourscript
或cat yourscript | tr -d '\r' > fixedscript
从命令行中删除它们。
回车符只是bash的另一个字符。 then
与then\r
不同,因此bash不会将其识别为关键字并假定它是一个命令。然后它继续寻找then
并且失败
如果在then
之后恰好有一个尾随空格,则fi
会出现类似的问题。