Jak złożyć oświadczenie, które sprawdza, czy coś jest podzielne przez coś innego bez reszty (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

Instrukcja if [$ number] jest tym, czego nie wiem jak skonfigurować

John T.
źródło
Witaj Roger. Czy możesz zawinąć kod w swoim pytaniu w tagi kodu (lub użyć przycisku kodu w edytorze)? Sprawia, że ​​rzeczy są dużo łatwiejsze do odczytania.
Telemachus

Odpowiedzi:

39

Możesz użyć prostszej składni w Bash niż niektóre inne pokazane tutaj:

#!/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
Wstrzymano do odwołania.
źródło
dzięki! wiedziałem, że musi być prostszy sposób, ale nie miałem szczęścia. Skrypty bash zawsze były dla mnie trochę czarną sztuką.
quack quixote
Spowoduje to wyświetlenie komunikatu o błędzie „((: 08: wartość zbyt duża dla podstawy (token błędu to„ 08 ”)” i „((: 09: wartość zbyt duża dla podstawy (token błędu to„ 09 ”)) patrz ubuntuforums.org/showthread.php?t=677751 w celu wyjaśnienia
Red Cricket
@RedCricket: Tylko jeśli wprowadzisz wiodące zero. Jeśli to jest problem, możesz: if (( 10#$number % 5 == 0 ))wymusić $numberinterpretację jako podstawa 10 (zamiast podstawy 8 / ósemki sugerowanej przez wiodące zero).
Wstrzymano do odwołania.
@Deniis Williamson Tak, to jest bardziej dokładne. Dzięki! :)
Red Cricket,
11

Nie jest wymagane bc , o ile jest to matematyka liczb całkowitych (będziesz potrzebować bc do liczb zmiennoprzecinkowych): W bashu operator (()) działa jak wyrażenie .

Jak zauważyli inni, operacja, którą chcesz wykonać, to modulo (%) .

#!/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
quack quixote
źródło
3

Co powiesz na użycie bcpolecenia:

!/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
nagul
źródło
1
Alternatywnie, możesz użyć wyrażenia zamiast bc: pozostała =expr $number % $divisor
Dan Dyer
@ Dan Tak, powinno wystarczyć OP. Myślę jednak, że ponieważ bcspecjalizuje się w obliczeniach, może obsługiwać takie rzeczy, jak 33,3% 11,1, które exprprawdopodobnie mogłyby się zadławić.
nagul
zdecydowanie zadławiłby się; expr i (()) obsługują tylko matematykę całkowitą.
quack quixote
3

Odpowiedź Nagula jest świetna, ale po prostu fyi, pożądaną operacją jest moduł (lub moduł), a operator ogólnie %.

Telemachus
źródło
1

Zrobiłem to w inny sposób. Sprawdź, czy to działa dla Ciebie.
Przykład 1 :

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

Przykład 2:

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

Prosta logika.

12/3 = 4
4 * 3 = 12 -> ten sam numer

11/3 = 3
3 * 3 = 9 -> inny numer

smilyface
źródło
0

Właśnie w interesie neutralności składni i naprawiania jawnego nachylenia notacji infix wokół tych części, zmodyfikowałem rozwiązanie nagul do użycia 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
źródło
Zdaję sobie sprawę, że to naprawdę stare pytanie, ale mam pytanie dotyczące kodu. Jestem stosunkowo nowy w bash i właśnie próbowałem uruchomić ten skrypt. Daje mi to jednak kilka błędów i szczerze mówiąc nie wiem dlaczego. Po wprowadzeniu liczby i dzielnika otrzymuję: test.sh: 7: test.sh: dc: nie znaleziono Pozostała część: test.sh: 10: [: nieoczekiwany operator „Twój numer nie jest podzielny przez 2” Czy masz pojęcie, dlaczego ?
AreusAstarte
1
@AreusAstarte: To znaczy, że nie masz dczainstalowanego.
Wstrzymano do odwołania.
0

Możesz również użyć exprtak:

#!/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
Red Cricket
źródło