Come fare una dichiarazione che controlla se qualcosa è divisibile per qualcos'altro senza resto (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'istruzione if [$ number] è ciò che non so come impostare


Benvenuto Roger. Puoi per favore avvolgere il codice nella tua domanda in tag di codice (o utilizzare il pulsante del codice nell'editor)? Rende le cose molto più facili da leggere.
Telemaco,

Risposte:


39

Puoi usare una sintassi più semplice in Bash rispetto ad alcuni degli altri mostrati qui:

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

Grazie! sapevo che doveva esserci un modo più semplice ma non avevo fortuna. lo script bash è sempre stato un po 'un'arte nera per me.
Quack Quixote

Ciò comporterà il messaggio di errore "(((: 08: valore troppo grande per la base (il token di errore è" 08 ")" e "((: 09: valore troppo grande per la base (il token di errore è" 09 ")" vedere ubuntuforums.org/showthread.php?t=677751 per la spiegazione
Red Cricket

@RedCricket: solo se inserisci uno zero iniziale. Se questo è un problema, puoi fare: if (( 10#$number % 5 == 0 ))forzare $numberad essere interpretato come base 10 (invece di base 8 / ottale implicita dallo zero iniziale).
In pausa fino a nuovo avviso.

@Deniis Williamson Sì, è più preciso. Grazie! :)
Red Cricket,

11

Nessun bc necessario fintanto che è matematica intera (avrai comunque bisogno di bc per il virgola mobile): in bash, l' operatore (()) funziona come expr .

Come altri hanno sottolineato, l'operazione desiderata è 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

3

Che ne dici di usare il 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
In alternativa, puoi usare expr invece di bc: remainder =expr $number % $divisor
Dan Dyer

@Dan Sì, dovrebbe essere sufficiente per l'OP. Tuttavia, penso che dal momento che è bcspecializzato in calcoli, può gestire cose come il 33,3% 11,1 che exprprobabilmente soffocerebbero.
nagul

sarebbe sicuramente soffocare; expr e (()) gestiscono solo la matematica dei numeri interi.
Quack Quixote

3

La risposta di Nagul è ottima, ma solo, l'operazione che vuoi è modulo (o modulo) e l'operatore è generalmente %.


1

L'ho fatto in un modo diverso. Controlla se funziona per te.
Esempio 1 :

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

Esempio 2:

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

Logica semplice.

12/3 = 4
4 * 3 = 12 -> stesso numero

11/3 = 3
3 * 3 = 9 -> non lo stesso numero


0

Proprio nell'interesse della neutralità della sintassi e riparando la distorsione evidente della notazione infografica attorno a queste parti, ho modificato la soluzione di nagul da usare 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

Mi rendo conto che questa è una domanda molto vecchia, ma ho una domanda sul codice. Sono relativamente nuovo a bash e ho appena provato a eseguire questo script. Tuttavia mi dà alcuni errori e sinceramente non so perché. Dopo aver inserito il numero e il divisore ottengo: test.sh: 7: test.sh: dc: non trovato Resto: test.sh: 10: [: operatore imprevisto "Il tuo numero non è divisibile per 2" Hai idea del perché ?
AreusAstarte,

1
@AreusAstarte: significa che non hai dcinstallato.
In pausa fino a nuovo avviso.

0

Puoi anche usare exprcosì:

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.