为什么算术扩展在 Bash 中有效,但在 Zsh 中无效?

为什么算术扩展在 Bash 中有效,但在 Zsh 中无效?

我在课堂上向我的学生演示了一段有趣的代码(或者我认为是这样),令我惊讶的是,它在zsh.然后我切换到bash并且它按预期工作。

代码如下:

[ $(( $RANDOM % 6 )) == 0 ] && echo "Boom" || echo "Click"

正如预期的那样,它bash会打印BoomClick随机打印。但zsh我收到以下错误消息:

zsh:= 未找到

谁能解释一下有什么区别吗?据我了解,两个 shell 应该以相同的方式解释脚本。

谢谢。

答案1

尝试做unsetopt equals然后再试一次。或者在第一个等于字符上加上引号。

如果您使用[for 条件,则所有参数都会正常计算,并且单词开头的 = 是获取命令位置的有用 zsh 简写。例如=ls扩展到/bin/ls.给定的==zsh 查找=命令但没有找到。

posix 模式(sh 模拟)下的 Zsh 与 bash 的兼容性会好很多。很多东西都是兼容的,而且学到的大多数 bash 知识仍然有用,但是如果你想编写可移植脚本,有些事情需要注意。

与它不同的是[,它是内置的,[[它是解析器可以理解的保留字,并且会给您带来更少的问题。然而,在这种情况下,您使用的是算术模式,因此您可以简化它:

    (( RANDOM % 6 == 0 )) && echo "Boom" || echo "Click"

事实上,与零的比较甚至是多余的,因为默认返回状态反映了该值是否为零,尽管含义相反:

    (( RANDOM % 6 )) && echo "Click" || echo "Boom"

相关内容