Следующая программа выдает ошибку в строках 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
Переписал сценарий оболочки для вас:
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
Для этого сослались на следующее:
Я не буду решать вашу проблему, но покажу вам, где вы не правы. В вашем сценарии есть 2 вида ошибок:
[ $m -le $n ]
strike>. Когда вы сравниваете два целых числа в bash, вы должны использовать кавычки следующим образом:
[ "$m" -le "$n" ]
или:
(("$m" <= "$n"))
Подробнее о: Операторы сравнения .
<удар> i=`expr $i +1`
удар>. Когда вы используете expr
, используйте пробелы до и после операторов. Итак, правильный путь:
i=`expr $i + 1`
Другие альтернативы:
let i=$i+1
или:
i=$(($i+1))
Подробнее о: Операторы .
Помимо синтаксических ошибок в вашем скрипте, на которые уже указывал Раду, существует несколько логических ошибок. Я даю вам уточненный код. Он будет утверждать, является ли число простым или нет в диапазоне
#!/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
notify-send 'DONE'
производит воздушный шар, который исчезает после временного интервала. Если я вдали от клавиатуры некоторое время, я мог бы пропустить предупреждение и никогда не узнавать, что программа завершилась, если я вручную не проверяю. Существует ли способ заставить воздушный шар остаться неопределенно, пока это не нажато или что-то?
– becko
5 August 2015 в 15:20