Wie man eine Aussage macht, die prüft, ob etwas ohne Rest durch etwas anderes teilbar ist (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

Die if [$ number] -Anweisung ist das, was ich nicht einrichten kann

John T
quelle
Willkommen, Roger. Können Sie den Code in Ihrer Frage bitte in Code-Tags einschließen (oder die Code-Schaltfläche im Editor verwenden)? Es macht die Dinge viel einfacher zu lesen.
Telemachus

Antworten:

39

Sie können in Bash eine einfachere Syntax verwenden als einige der hier gezeigten:

#!/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
Bis auf weiteres angehalten.
quelle
Vielen Dank! Ich wusste, dass es einen einfacheren Weg geben musste, aber ich hatte kein Glück. bash scripting war für mich schon immer eine schwarze kunst.
Quack Quijote
Dies führt zu der Fehlermeldung "((: 08: Wert zu groß für Basis (Fehlertoken ist" 08 ")" und "((: 09: Wert zu groß für Basis (Fehlertoken ist" 09 ")") " ubuntuforums.org/showthread.php?t=677751 zur Erklärung
Red Cricket
@RedCricket: Nur wenn Sie eine führende Null eingeben. Wenn das ein Problem ist, können Sie Folgendes tun: if (( 10#$number % 5 == 0 ))erzwingen $number, dass es als Basis 10 interpretiert wird (anstelle der durch die führende Null implizierten Basis 8 / Oktal).
Bis auf weiteres angehalten.
@ Deniis Williamson Ja das ist genauer. Vielen Dank! :)
Red Cricket
11

Es wird kein bc benötigt, solange es sich um eine Ganzzahl handelt (für Gleitkommazahlen benötigen Sie jedoch bc): In bash funktioniert der Operator (()) wie expr .

Wie andere darauf hingewiesen haben, ist die gewünschte Operation 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
Quacksalber
quelle
3

Wie wäre es mit dem bcBefehl:

!/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
quelle
1
Alternativ können Sie auch expr anstelle von bc verwenden: remainder =expr $number % $divisor
Dan Dyer
@Dan Ja, es sollte für das OP ausreichen. Ich denke jedoch, da es bcsich auf Berechnungen spezialisiert hat, kann es Dinge wie 33,3% 11,1 verarbeiten, die exprwahrscheinlich ersticken würden.
Nagul
würde definitiv ersticken; Ausdruck und (()) behandeln nur Ganzzahl-Mathematik.
Quack Quijote
3

Naguls Antwort ist großartig, aber nur zur Info, die gewünschte Operation ist Modul (oder Modulo) und der Operator ist im Allgemeinen %.

Telemachus
quelle
1

Ich habe es anders gemacht. Überprüfen Sie, ob es bei Ihnen funktioniert.
Beispiel 1 :

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

Beispiel 2:

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

Einfache Logik.

12/3 = 4
4 * 3 = 12 -> gleiche Anzahl

11/3 = 3
3 * 3 = 9 -> nicht gleiche Anzahl

Smilyface
quelle
0

Nur im Interesse der Syntaxneutralität und der Korrektur der offensichtlichen Beeinträchtigung der Infix-Notation um diese Teile habe ich die Nagul-Lösung für die Verwendung modifiziert 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
quelle
Mir ist klar, dass dies eine sehr alte Frage ist, aber ich habe eine Frage zum Code. Ich bin relativ neu im Bashing und habe gerade versucht, dieses Skript auszuführen. Es gibt mir jedoch ein paar Fehler und ich weiß ehrlich gesagt nicht warum. Nach Eingabe von Zahl und Teiler erhalte ich: test.sh: 7: test.sh: dc: nicht gefunden Rest: test.sh: 10: [: unerwarteter Operator “Ihre Zahl ist nicht durch 2 teilbar” Haben Sie eine Idee warum ?
AreusAstarte
1
@AreusAstarte: Es bedeutet, dass Sie nicht dcinstalliert haben.
Bis auf weiteres angehalten.
0

Sie könnten auch exprso verwenden:

#!/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
Rotes Kricket
quelle