我有一个简单的脚本:
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
的行为是否以某种相关方式不同?
答案 0 :(得分:3)
显然在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