繁体   English   中英

bash / zsh脚本行为的区别

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM