Что не так с моим сценарием оболочки?

Следующая программа выдает ошибку в строках 7 и 9: цикл while, похоже, не работает. Это программа для отображения всех простых и составных чисел от 3 до заданного заданного значения.

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
0
задан 16 February 2014 в 16:37

3 ответа

Переписал сценарий оболочки для вас:

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

Для этого сослались на следующее:

0
ответ дан 16 February 2014 в 16:37

Я не буду решать вашу проблему, но покажу вам, где вы не правы. В вашем сценарии есть 2 вида ошибок:

  1. [ $m -le $n ] . Когда вы сравниваете два целых числа в bash, вы должны использовать кавычки следующим образом:

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

    или:

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

    Подробнее о: Операторы сравнения .

  2. <удар> i=`expr $i +1` . Когда вы используете expr, используйте пробелы до и после операторов. Итак, правильный путь:

    i=`expr $i + 1`
    

    Другие альтернативы:

    let i=$i+1
    

    или:

    i=$(($i+1))
    

    Подробнее о: Операторы .

0
ответ дан 16 February 2014 в 16:37

Помимо синтаксических ошибок в вашем скрипте, на которые уже указывал Раду, существует несколько логических ошибок. Я даю вам уточненный код. Он будет утверждать, является ли число простым или нет в диапазоне

#!/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

Я ввел новую переменную flag для правильной печати чисел. сохраните скрипт как check_prime.sh и дайте ему разрешение на выполнение.

Выход

$ ./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
0
ответ дан 16 February 2014 в 16:37
  • 1
    notify-send 'DONE' производит воздушный шар, который исчезает после временного интервала. Если я вдали от клавиатуры некоторое время, я мог бы пропустить предупреждение и никогда не узнавать, что программа завершилась, если я вручную не проверяю. Существует ли способ заставить воздушный шар остаться неопределенно, пока это не нажато или что-то? – becko 5 August 2015 в 15:20

Другие вопросы по тегам:

Похожие вопросы: