我在课堂上向我的学生演示了一段有趣的代码(或者我认为是这样),令我惊讶的是,它在zsh
.然后我切换到bash
并且它按预期工作。
代码如下:
[ $(( $RANDOM % 6 )) == 0 ] && echo "Boom" || echo "Click"
正如预期的那样,它bash
会打印Boom
或Click
随机打印。但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"