Comment faire une déclaration qui vérifie si quelque chose est divisible par quelque chose d'autre sans reste (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

l'instruction if [$ number] est ce que je ne sais pas comment configurer

John T
la source
Bienvenue, Roger. Pouvez-vous envelopper le code dans votre question dans des balises de code (ou utiliser le bouton de code sur l'éditeur)? Cela rend les choses beaucoup plus faciles à lire.
Télémaque

Réponses:

39

Vous pouvez utiliser une syntaxe plus simple dans Bash que certaines des autres illustrées ici:

#!/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
En pause jusqu'à nouvel ordre.
la source
Merci! je savais qu'il devait y avoir un moyen plus simple mais je n'ai pas eu de chance. Les scripts bash ont toujours été un peu un art noir pour moi.
Quack Quichotte
Cela entraînera le message d'erreur "((: 08: valeur trop grande pour la base (le jeton d'erreur est" 08 ")" et "((: 09: valeur trop grande pour la base (le jeton d'erreur est" 09 ")" voir ubuntuforums.org/showthread.php?t=677751 pour explication
Red Cricket
@RedCricket: Uniquement si vous entrez un zéro non significatif. Si c'est un problème, vous pouvez faire: if (( 10#$number % 5 == 0 ))pour forcer $numberà être interprété comme base 10 (au lieu de base 8 / octal impliqué par le zéro de tête).
pause jusqu'à nouvel ordre.
@Deniis Williamson Oui, c'est plus précis. Merci! :)
Red Cricket
11

Aucun bc n'est nécessaire tant qu'il s'agit de mathématiques entières (vous aurez cependant besoin de bc pour la virgule flottante): En bash, l' opérateur (()) fonctionne comme expr .

Comme d'autres l'ont souligné, l'opération que vous souhaitez est 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 Quichotte
la source
3

Que diriez-vous d'utiliser la bccommande:

!/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
la source
1
Alternativement, vous pouvez utiliser expr au lieu de bc: reste =expr $number % $divisor
Dan Dyer
@Dan Oui, cela devrait suffire pour l'OP. Cependant, je pense qu'étant bcspécialisé dans les calculs, il peut gérer des choses comme 33,3% 11,1 qui exprs'étoufferaient probablement.
nagul
serait certainement étouffer; expr et (()) ne gèrent que les mathématiques entières.
Quack Quichotte
3

La réponse de Nagul est excellente, mais juste pour info, l'opération que vous voulez est le module (ou modulo) et l'opérateur est généralement %.

Télémaque
la source
1

Je l'ai fait d'une manière différente. Vérifiez si cela fonctionne pour vous.
Exemple 1 :

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

Exemple 2:

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

Logique simple.

12/3 = 4
4 * 3 = 12 -> même nombre

11/3 = 3
3 * 3 = 9 -> pas le même nombre

smilyface
la source
0

Dans l'intérêt de la neutralité syntaxique et de la correction du biais de notation infixe manifeste autour de ces parties, j'ai modifié la solution de nagul à utiliser 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
la source
Je me rends compte que c'est une très vieille question mais j'ai une question sur le code. Je suis relativement nouveau à bash et j'ai juste essayé d'exécuter ce script. Cependant, cela me donne quelques erreurs et je ne sais vraiment pas pourquoi. Après avoir entré le nombre et le diviseur, j'obtiens: test.sh: 7: test.sh: dc: non trouvé Reste: test.sh: 10: [: opérateur inattendu "Votre nombre n'est pas divisible par 2" Avez-vous une idée pourquoi ?
AreusAstarte
1
@AreusAstarte: Cela signifie que vous n'avez pas dcinstallé.
pause jusqu'à nouvel ordre.
0

Vous pouvez également utiliser exprcomme ceci:

#!/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
Cricket rouge
la source