【问题标题】:for loop on command line in zsh: parse error near `done'zsh中命令行上的for循环:“完成”附近的解析错误
【发布时间】:2019-03-25 05:29:00
【问题描述】:

我不明白为什么会出现此错误?这对我来说似乎是很好的语法。

$ for f in todo/family/* ; echo "$f" ; done
zsh: parse error near `done'

第一个$ 是 PS1 - 这是在常规“命令行”上 - 不在文件中。

【问题讨论】:

  • 您需要dofor f in todo/family/*; do echo "$f"; done
  • 顺便说一句,虽然它一般不支持 zsh,但这是 shellcheck.net 会捕获的(只要您尝试使用的语法取自POSIX sh 系列,因此也兼容 sh/ksh/bash/dash)。
  • for 循环在zsh 中有一个缩短的单行形式,不过:for f (todo/family/*); echo "$f"。不需要doindone 关键字,并且列表放在索引变量后面的括号中。在这种情况下,正文中只允许一个子列表。
  • (最好阅读man zshmisc,尤其是在“复杂命令的替代形式”下,以准确了解使用简写形式可以表示和不能表示的内容。)
  • @CharlesDuffy - 冒着稍后将该问题标记为删除的风险 - 我将留下一个格式正确的答案。我希望加倍努力并按照您的建议展示如何使用拼写检查命令找到这些问题将对未来的访问者有所帮助。感谢您的所有帮助。

标签: for-loop command-line zsh parse-error


【解决方案1】:

我的命令中缺少 do

根据@CharlesDuffy 的评论,这显然是与拼写错误/缺少语法相关的问题。

What I wrote:  for f in todo/family/* ; echo "$f" ; done
#                                      ^ missing do

Bash expected: for f in todo/family/* ; do echo "$f" ; done

使用 spellcheck.net(另一个很好的资源)显然可以看到这个错误/错字 - 感谢 Charles。


如何检查 Bash 相关的语法错误:

1。转到shellcheck.net 并将其粘贴到:

#!/bin/sh

for f in todo/family/* ; echo "$f" ; done

你会清楚地看到错误:

$ shellcheck myscript

Line 3:
for f in todo/family/* ; echo "$f" ; done
^-- SC1073: Couldn't parse this for loop. Fix to allow more checks.
                         ^-- SC1058: Expected 'do'.
                         ^-- SC1072: Expected 'do'. Fix any mentioned problems and try again.

echo 之前添加带有空格的do,然后所有内容都会检查出来:

#!/bin/sh

for f in todo/family/* ; do echo "$f" ; done

进入 spellcheck.net - 你可以看到没有错误。删除do,你会看到我的问题是什么。

2。或者,您可以通过多种方式install the shellcheck command

https://github.com/koalaman/shellcheck#installing

【讨论】:

    猜你喜欢
    • 2022-11-05
    • 2018-10-19
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    相关资源
    最近更新 更多