Как сделать утверждение, которое проверяет, делится ли что-то на что-то другое без остатка (BASH)

21
#!/bin/bash


Echo Enter a number

Read  $number

If [$number ] ; then 

Echo Your number is divisible by 5

Else

Echo Your number is not divisible by 5

fi

оператор if [$ number] - это то, что я не знаю, как настроить

Джон Т
источник
Добро пожаловать, Роджер. Можете ли вы обернуть код вашего вопроса в теги кода (или использовать кнопку кода в редакторе)? Это делает вещи намного проще для чтения.
Телемах

Ответы:

39

Вы можете использовать более простой синтаксис в Bash, чем некоторые другие, показанные здесь:

#!/bin/bash
read -p "Enter a number " number    # read can output the prompt for you.
if (( $number % 5 == 0 ))           # no need for brackets
then
    echo "Your number is divisible by 5"
else
    echo "Your number is not divisible by 5"
fi
Приостановлено до дальнейшего уведомления.
источник
Благодарность! я знал, что должен быть более простой путь, но мне не повезло. Сценарии bash всегда были для меня чем-то вроде чёрного искусства.
Квик-кихот
Это приведет к появлению сообщения об ошибке "((:: 08: слишком большое значение для базы (токен ошибки" 08 ")" и "((:: 09: слишком большое значение для базы (токен ошибки" 09 ")" см. ubuntuforums.org/showthread.php?t=677751 для объяснения
Красный Крикет
@RedCricket: только если вы введете ведущий ноль. Если это проблема, вы можете сделать следующее: if (( 10#$number % 5 == 0 ))заставить $numberинтерпретироваться как основание 10 (вместо основания 8 / восьмеричное значение, подразумеваемое начальным нулем).
Приостановлено до дальнейшего уведомления.
@Deniis Williamson Да, это более точно. Благодарность! :)
Красный Крикет
11

Нет необходимости в bc, если это целочисленная математика (хотя для плавающей запятой вам понадобится bc): В bash оператор (()) работает как expr .

Как уже отмечали другие, вы хотите выполнить операцию по модулю (%) .

#!/bin/bash  

echo "Enter a number"
read number

if [ $(( $number % 5 )) -eq 0 ] ; then
   echo "Your number is divisible by 5"
else
   echo "Your number is not divisible by 5"
fi
шарлатан
источник
3

Как насчет использования bcкоманды:

!/usr/bin/bash

echo Enter a number
read number
echo Enter divisor
read divisor
remainder=`echo "${number}%${divisor}" | bc`
echo "Remainder: $remainder"

if [ "$remainder" == "0" ] ; then
        echo Your number is divisible by $divisor
else
        echo Your number is not divisible by $divisor
fi
Нагул
источник
1
В качестве альтернативы вы можете использовать expr вместо bc: remainder =expr $number % $divisor
Дэн Дайер
@ Дан Да, этого должно хватить для ОП. Тем не менее, я думаю, так как он bcспециализируется на вычислениях, он может обрабатывать такие вещи, как 33,3% 11,1, которые expr, вероятно, задохнутся.
Нагуль
определенно задохнется; expr и (()) обрабатывают только целочисленную математику.
Квик-кихот
3

Ответ Нагула великолепен, но, к вашему сведению, операция, которую вы хотите, - это модуль (или модуль), а оператор в целом %.

Телемах
источник
1

Я сделал это по-другому. Проверьте, работает ли он для вас.
Пример 1:

num=11;
[ `echo $num/3*3 | bc` -eq $num ] && echo "is divisible" || echo "not divisible"
Output : not divisible

Пример 2:

num=12;
[ `echo $num/3*3 | bc` -eq $num ] && echo "is divisible" || echo "not divisible"
Output : is divisible

Простая логика.

12/3 = 4
4 * 3 = 12 -> тот же номер

11/3 = 3
3 * 3 = 9 -> не тот же номер

smilyface
источник
0

В интересах нейтральности синтаксиса и исправления предвзятого представления инфиксных обозначений вокруг этих частей, я изменил решение nagul для использования dc.

!/usr/bin/bash

echo Enter a number
read number
echo Enter divisor
read divisor
remainder=$(echo "${number} ${divisor}%p" | dc)
echo "Remainder: $remainder"

if [ "$remainder" == "0" ]
then
        echo Your number is divisible by $divisor
else
        echo Your number is not divisible by $divisor
fi
Eroen
источник
Я понимаю, что это действительно старый вопрос, но у меня есть вопрос о коде. Я относительно новичок в bash и просто попытался запустить этот скрипт. Однако это дает мне несколько ошибок, и я, честно говоря, не знаю почему. После ввода числа и делителя я получаю: test.sh: 7: test.sh: dc: не найден Остаток: test.sh: 10: [: неожиданный оператор «Ваш номер не делится на 2». У вас есть идея, почему ?
AreusAstarte
1
@AreusAstarte: Это означает, что вы не dcустановили.
Приостановлено до дальнейшего уведомления.
0

Вы также можете использовать exprтак:

#!/bin/sh

echo -n "Enter a number: "
read number
if [ `expr $number % 5` -eq 0 ]
then
    echo "Your number is divisible by 5"
else
    echo "Your number is not divisible by 5"
fi
Красный крикет
источник