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

Jef*_*eff 5 bash zsh shell-script arithmetic

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

代码如下:

[ $(( $RANDOM % 6 )) == 0 ] && echo "Boom" || echo "Click"
Run Code Online (Sandbox Code Playgroud)

bash它打印BoomClick随机,符合市场预期。但在zsh我收到以下错误消息:

zsh: = 未找到

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

谢谢。

oka*_*api 10

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

如果使用[for 条件,则所有参数都会正常计算,并且单词开头的 = 是获取命令位置的有用 zsh 速记。例如=ls扩展到/bin/ls. 鉴于==zsh 寻找一个=命令,但没有找到。

posix 模式下的 Zsh(sh 仿真)将与 bash 更加兼容。许多东西是兼容的,并且大多数学习的 bash 知识仍然有用,但是如果您想编写可移植的脚本,则需要注意某些事项。

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

    (( RANDOM % 6 == 0 )) && echo "Boom" || echo "Click"
Run Code Online (Sandbox Code Playgroud)

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

    (( RANDOM % 6 )) && echo "Click" || echo "Boom"
Run Code Online (Sandbox Code Playgroud)