O que há de errado com meu script de shell?

0

O seguinte programa está dando erro na linha 7 e 9: o loop while não parece estar funcionando. É um programa para mostrar todos os números primos e compostos de 3 para uma entrada desejada.

echo prograam to find all the prime numbers from 3 to given number
echo enter the last number
read number
n=$number
i=3
m=3
    while [ $m -le $n ]
    do 
        while [ $i -le $m ]
        do  
        m='expr $n % $i'
        i='expr $i +1'
            if [ $m -eq 0 ]
            then
            echo $n is a prime number \n
            else
            echo $n is not a prime number \n
            fi
        done
    m='expr $m +1'
    done
    
por Arpan jain 16.02.2014 / 13:34

3 respostas

2

Reescrevemos o script de shell para você:

echo "program to find all the prime numbers from 3 to given number"
echo "enter the last number"
read number
n=$number
i=2
m=2
is_prime=0
    while [ "$m" -lt "$n" ]
    do
        while [ "$i" -le "$m" ]
        do
            m=$(expr $n % $i)
            i=$(expr $i + 1)
            if [ "$m" -eq 0 ]
                then
                echo "$n is not a prime number"
                exit
            else
                is_prime=1
            fi
        done
    m=$(expr "$m" + 1)
    done
if [ "$is_prime" -eq 1 ]; then
    echo "$n is a prime number"
fi
exit

Refere-se ao seguinte:

por jobin 16.02.2014 / 14:32
3

Eu não vou resolver o seu problema, mas vou mostrar onde você está errado. Existem dois tipos de erros no seu script:

  1. [ $m -le $n ] . Quando você compara dois inteiros no bash, você deve usar aspas da seguinte forma:

    [ "$m" -le "$n" ]
    

    ou:

    (("$m" <= "$n"))
    

    Mais sobre: Operadores de comparação .

  2. i='expr $i +1' . Quando você usa expr , use espaços antes e depois dos operadores. Então, o caminho certo é:

    i='expr $i + 1'
    

    Outras alternativas são:

    let i=$i+1
    

    ou:

    i=$(($i+1))
    

    Mais sobre: Operadores .

por Radu Rădeanu 16.02.2014 / 14:38
0

Além dos erros de sintaxe em seu script que Radu já apontou, há poucos erros lógicos. Eu estou te dando o código refinado. Ele irá afirmar se um número é primo ou não dentro do intervalo

#!/bin/bash
echo "prograam to find all the prime numbers from 3 to given number"
echo "enter the last number: "
read number

m=3
while [ $m -le $number ]
do
    i=2
    flag=0
    while [ $i -lt $m ]
    do
    if [ 'expr $m % $i' -eq 0 ]
    then
        echo "$m is not a prime number"
        flag=1
        break               
    fi
    i='expr $i + 1' 
    done
    if [ "$flag" = 0 ]; then
    echo "$m is a prime number"
    fi
   m='expr $m + 1'
done

Eu introduzi uma nova variável flag para imprimir os números corretamente. salve o script como check_prime.sh e conceda a ele permissão de execução.

Resultado

$ ./check_prime.sh
prograam to find all the prime numbers from 3 to given number
enter the last number: 
12
3 is a prime number
4 is not a prime number
5 is a prime number
6 is not a prime number
7 is a prime number
8 is not a prime number
9 is not a prime number
10 is not a prime number
11 is a prime number
12 is not a prime number
    
por souravc 16.02.2014 / 16:16