Isso porque você está gerando um sub-shell toda vez:
if ([ $remainder == 0 ] && [ $is_prime == true ]); then
Basta remover os parênteses
if [ $remainder == 0 ] && [ $is_prime == true ]; then
Se você deseja agrupar comandos, existe uma sintaxe para fazer isso no shell atual :
if { [ $remainder == 0 ] && [ $is_prime == true ]; }; then
(o ponto-e-vírgula final é obrigatório, consulte o manual )
Observe que [ is_prime ]
não é o mesmo que [ $is_prime == true ]
: você poderia escrever isso como simplesmente $is_prime
(sem colchetes), o que invocaria o comando bash true
ou false
incorporado. > [ is_prime ]
é um teste com um argumento, a string "is_prime" - quando [
recebe um único argumento, o resultado é sucesso se o argumento não é vazio, e essa string literal é sempre não vazia, portanto, sempre "verdadeiro".
Por questões de legibilidade, eu mudaria a linha muito longa
[ $is_prime == true ] && echo "${number_under_test} is prime!" || echo "${number_under_test} is NOT prime (factors= $factors)" [ $is_prime == true ] && largest_prime=$number_under_test
para
if [ $is_prime == true ]; then
echo "${number_under_test} is prime!"
else
echo "${number_under_test} is NOT prime (factors= $factors)"
# removed extraneous [ $is_prime == true ] test that you probably
# didn't notice off the edge of the screen
largest_prime=$number_under_test
fi
Não subestime o espaço em branco para melhorar a clareza.