Compare a variável bash para ver se divisível por 5

1

Aqui está o meu código; Eu quero comparar $COUNTER para várias vezes.

if [ "$COUNTER" = "5" ]; then

Tudo bem, mas eu quero fazer isso por tempos dinâmicos como 5,10,15,20 etc.

    
por Mehran Goudarzi 11.02.2018 / 15:37

3 respostas

0

A conclusão dos vários comentários parece ser que a resposta mais simples para a pergunta original é

if ! (( $COUNTER % 5 )) ; then
    
por 11.02.2018 / 17:08
2

Você pode fazer isso usando o operador aritmético de módulo:

#!/bin/sh

counter="$1"
remainder=$(( counter % 5 ))
echo "Counter is $counter"
if [ "$remainder" -eq 0 ]; then
    echo 'its a multiple of 5'
else
    echo 'its not a multiple of 5'
fi

Em uso:

$ ./modulo.sh 10
Counter is 10
its a multiple of 5
$ ./modulo.sh 12
Counter is 12
its not a multiple of 5
$ ./modulo.sh 300
Counter is 300
its a multiple of 5

Eu também escrevi um loop que pode ser o que você está procurando? Isso irá percorrer cada número de 1 a 600 e verificar se eles são múltiplos de 5:

loop.sh

#!/bin/sh
i=1
while [ "$i" -le 600 ]; do
        remainder=$(( i % 5 ))
        [ "$remainder" -eq 0 ] && echo "$i is a multiple of 5"
        i=$(( i + 1 ))
done

output (encurtado)

$ ./loop.sh
5 is a multiple of 5
10 is a multiple of 5
15 is a multiple of 5
20 is a multiple of 5
25 is a multiple of 5
30 is a multiple of 5
...
555 is a multiple of 5
560 is a multiple of 5
565 is a multiple of 5
570 is a multiple of 5
575 is a multiple of 5
580 is a multiple of 5
585 is a multiple of 5
590 is a multiple of 5
595 is a multiple of 5
600 is a multiple of 5
    
por 11.02.2018 / 15:55
2

Respondendo a pergunta exatamente como está atualmente escrito, desconsiderando o título (que foi editado).

Para comparar um inteiro em uma variável com um número de outros valores inteiros, onde os outros valores são determinados antes do tempo (não está claro o que "dinamicamente" realmente significa na pergunta):

case "$value" in
    5|10|15|200|400|600)
        echo 'The value is one of those numbers' ;;
    *)
        echo 'The value is not one of those numbers'
esac

Isso também pode ser feito em um loop, é claro,

for i in 5 10 15 200 400 600; do
    if [ "$value" -eq "$i" ]; then
        echo 'The value is one of those numbers'
        break
    fi
done

Mas isso torna mais difícil lidar com o caso em que $value não é encontrado entre os números fornecidos sem usar algum tipo de sinalizador:

found=0
for i in 5 10 15 200 400 600; do
    if [ "$value" -eq "$i" ]; then
        echo 'The value is one of those numbers'
        found=1
        break
    fi
done

if [ "$found" -eq 0 ]; then
    echo 'The value is not one of those numbers'
fi

Ou mais limpo,

found=0
for i in 5 10 15 200 400 600; do
    if [ "$value" -eq "$i" ]; then
        found=1
        break
    fi
done

if [ "$found" -eq 1 ]; then
    echo 'The value is one of those numbers'
else
    echo 'The value is not one of those numbers'
fi

Eu pessoalmente escolheria a implementação de case ... esac .

    
por 11.02.2018 / 17:59