[英]bash / zsh script behaviour difference
我有一个简单的脚本:
is_prime () {
local factors
factors=( $( factor "$1" | cut -d ':' -f 2 ) )
[ ${#factors} -le 1 ]
}
starting () {
for i in $(seq 10 99); do
if is_prime "$i" ; then echo "$i" ; fi
done
}
starting
如果我使用/bin/zsh
运行它,它会打印10到99之间的所有素数,正如我所料。 但是,如果我使用/bin/bash
运行它,则完全相反 :它会打印该范围内的所有非素数值! 我理解zsh
的行为,但为什么bash会做它的作用呢? test
的行为是否以某种相关的方式不同?
显然在zsh
,数组上的${#factors}
zsh
${#factors}
扩展会获得数组的长度。 它不会在bash
这样做。 在bash
,它可以获得数组第一个元素的长度。
比较这些输出:
$ zsh -c 'foo=(a b c); echo $foo'
a b c
$ bash -c 'foo=(a b c); echo $foo'
a
$ zsh -c 'foo=(a b c); echo ${#foo}'
3
$ bash -c 'foo=(a b c); echo ${#foo}'
1
这就是为什么你的脚本出错了bash
。 要获得您期望的值,您需要使用${#factors[@]}
(这也适用于zsh
)。
$ zsh -c 'foo=(a b c); echo ${#foo[@]}'
3
$ bash -c 'foo=(a b c); echo ${#foo[@]}'
3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.