Cómo hacer una declaración que verifique si algo es divisible por otra cosa sin residuo (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

la declaración if [$ number] es lo que no sé cómo configurar


Bienvenido Roger. ¿Puede incluir el código de su pregunta en etiquetas de código (o usar el botón de código en el editor)? Hace las cosas mucho más fáciles de leer.
Telémaco el

Respuestas:


39

Puede usar una sintaxis más simple en Bash que algunas de las otras que se muestran aquí:

#!/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

¡Gracias! Sabía que tenía que haber una manera más simple, pero no estaba teniendo suerte. las secuencias de comandos bash siempre han sido un poco un arte negro para mí.
quack quijote

Esto dará como resultado el mensaje de error, "((: 08: valor demasiado grande para la base (el token de error es" 08 ")" y "((: 09: valor demasiado grande para la base (el token de error es" 09 ")" ver ubuntuforums.org/showthread.php?t=677751 para explicación.
Red Cricket

@RedCricket: solo si ingresa un cero inicial. Si eso es un problema, puede hacer: if (( 10#$number % 5 == 0 ))forzar $numbera ser interpretado como base 10 (en lugar de base 8 / octal implícito por el cero inicial).
Pausado hasta nuevo aviso.

@Deniis Williamson Sí, eso es más preciso. ¡Gracias! :)
Red Cricket

11

No se necesita bc siempre que sea matemática entera (aunque necesitará bc para coma flotante): en bash, el operador (()) funciona como expr .

Como otros han señalado, la operación que desea es módulo (%) .

#!/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

¿Qué hay de usar el bccomando:

!/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
Alternativamente, puede usar expr en lugar de bc: resto =expr $number % $divisor
Dan Dyer

@ Dan Sí, debería ser suficiente para el OP. Sin embargo, creo que dado que se bcespecializa en cálculos, puede manejar cosas como 33.3% 11.1 que exprprobablemente se ahogarían.
nagul

definitivamente se ahogaría; expr y (()) solo manejan matemática entera.
quack quijote

3

La respuesta de Nagul es excelente, pero para su información, la operación que desea es el módulo (o módulo) y el operador generalmente %.


1

Lo he hecho de otra manera. Comprueba si te funciona.
Ejemplo 1 :

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

Ejemplo 2

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

Lógica simple

12/3 = 4
4 * 3 = 12 -> mismo número

11/3 = 3
3 * 3 = 9 -> no es el mismo número


0

Solo en aras de la neutralidad de la sintaxis y la reparación del sesgo de notación infijo abierta alrededor de estas partes, he modificado la solución de nagul para usar 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

Me doy cuenta de que esta es una pregunta muy antigua, pero tengo una pregunta sobre el código. Soy relativamente nuevo en bash e intenté ejecutar este script. Sin embargo, me da algunos errores y, sinceramente, no sé por qué. Después de ingresar el número y el divisor obtengo: test.sh: 7: test.sh: dc: no encontrado Restante: test.sh: 10: [: operador inesperado "Su número no es divisible por 2" ¿Tiene alguna idea de por qué ?
AreusAstarte

1
@AreusAstarte: significa que no tienes dcinstalado.
Pausado hasta nuevo aviso.

0

También puedes usar exprasí:

#!/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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.