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

Следующая программа дает ошибку в строках 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
1
задан 16 February 2014 в 18:37

2 ответа

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

[ $m -le $n ]. Когда вы сравниваете два целых числа в bash, вы должны использовать кавычки следующим образом:
[ "$m" -le "$n" ]
или:
(("$m" <= "$n"))
Подробнее о: Операторы сравнения. [F7]. Когда вы используете expr, используйте пробелы до и после операторов. Итак, правильный путь:
i=`expr $i + 1`
Другие альтернативы:
let i=$i+1
или:
i=$(($i+1))
Подробнее о: Операторы.
3
ответ дан 24 May 2018 в 11:44
  • 1
    С помощью bash использование двойных скобок устраняет необходимость в котировках: [[ $m -le $n ]] является безопасным. В двойных круглых скобках доллар не нужен (( m <= n )). Вы можете назначить переменные в двойном parenthese: (( i++ )) – glenn jackman 16 February 2014 в 19:43

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

#!/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
ответ дан 24 May 2018 в 11:44

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

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