我有一个简单的脚本:
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
的行为方式是否有所不同?
for ((i=10; i<99; i++))
而不是for i in $(seq ...)
;这会使评估在shell内部进行而不是启动一个非标准化的外部工具。 (我曾经见过有人构建了一个实现seq
的程序,用单词拼出数字来恶作剧——“one”、“two”等等;因为没有POSIX标准指定它的行为,所以它可以做一些奇怪的事情,或者完全不存在)。 - Charles Duffycut
命令:在 zsh 中使用factor_str=$(factor "$1"); factor_str=${factor_str#*:}; read -A factors <<<"$factor_str"
,在 bash 中使用read -a factors <<<"$factor_str"
。老实说,它们是不同的 shell,假设它们之间的事情能够正常工作并不是一个好习惯。 - Charles Duffy