Why is a shell script giving syntax errors when the same code works elsewhere?
我有一个从工作脚本复制的简单shell脚本。 如果我将其复制粘贴到终端,它可以工作:
但是,当我使用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 `$'
' ..什么?
为什么会在这个特定的脚本中发生这种情况,而不是在我的命令行或我复制的脚本中?
-
考虑将shellcheck.net添加到您的自动化测试工作流程中。
-
代码附近是否有Windows机器?非工作版本可以有回车吗?其中一个错误使用$'
'表明这是问题所在。请参阅如何在bash脚本中将DOS / Windows换行符(CRLF)转换为Unix换行符( n)?在许多其他相关问题中。
-
@JonathanLeffler是的,我捏造了这个问题并给出了一个社区答案,因为我永远无法找到标记为重复的一般性问题。例如,你建议的那个是关于如何转换文件,而对于海报来说,为什么那就完全相关了。我已经将这个添加到bash标签wiki中,但是如果你找到一个更好的,我很乐意切换它。
-
有人问过很多次,你找不到有用的信息是令人惊讶的。这是一对夫妇1,2
-
@ThomasDickey如果你用任何问题更新bash标签wiki,你认为这是一个更好的,通用的,规范的常见问题解答,用于重复CR引起的语法错误,我将非常高兴删除这个问题! (找到好的是很棘手的,正如你的#2就是这个帖子所证明的那样。)
-
抱歉这个可怜的例子。这里还有一些:1,2,3。"糟糕的翻译"似乎找到了最多的评论(和答案)。该问题已存在(并且众所周知)10至15年。因此,一个好的答案将收集和总结更有用的答案。
-
@ThomasDickey很容易找到一个重复的答案,困难的部分是找到一个重复的问题 - 我想避免将关于"意外的文件结束"的问题标记为"糟糕的解释者"的重复,因为这看起来很混乱。我不同意,我会支持您找到/编辑/发布的任何问题和/或答案。我只想要一个规范的问题来重复数据删除。
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 yourscript或cat yourscript | tr -d '
' > fixedscript从命令行中删除它们。
为什么回车会导致语法错误?
回车字符只是bash的另一个字符。 then与then
不同,因此bash不会将其识别为关键字并假设它是一个命令。 然后它一直在寻找then并失败
如果在then之后碰巧有一个尾随空格,则会出现fi的类似问题。