zsh 5.8 接受缺失do/done的for循环结构的运行原因咨询
问题原因
你遇到的现象是zsh自带的**短循环(SHORT_LOOPS)**扩展特性导致的,这是zsh为了简化交互式场景下的输入设计的非POSIX兼容语法,默认在交互模式下处于开启状态。
具体说明
- 你可以执行
setopt | grep shortloops确认当前环境的选项状态,默认交互shell下会输出shortloops代表该特性已开启。 - 当
SHORT_LOOPS选项开启时,for循环支持省略do和done的简写规则:如果in遍历列表后的分号后没有紧跟do关键字,zsh会自动将分号后的第一个语句作为循环体,隐式补全do和done关键字。你误写的for f in a b; echo a; echo x就被zsh自动解析为你写的标准语法版本for f in a b; do echo a; done; echo x,所以会输出两次a、一次x。 - 你查阅的官方手册里的基础语法是POSIX兼容的标准写法,这类扩展特性会单独收录在zsh的选项说明文档中,你可以通过
man zshoptions查看SHORT_LOOPS的完整说明,该特性除了支持for循环的简写外,也支持repeat、if等控制语句的省略关键字写法。 - 如果你需要强制使用标准语法、关闭该扩展特性,可以执行
setopt no_shortloops,之后再运行你误写的代码就会抛出语法错误,符合标准语法规范的要求。
内容的提问来源于stack exchange,提问作者user1934428
相关产品推荐
相关产品推荐

