bash / zsh脚本行为的区别

时间:2015-02-18 16:10:40

标签: bash zsh

我有一个简单的脚本:

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的行为是否以某种相关方式不同?

1 个答案:

答案 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