web-dev-qa-db-fra.com

Comment faire si l'arithmétique des instructions en bash?

Je veux faire quelque chose comme ça:

if [ $1 % 4 == 0 ]; then
...

Mais cela ne fonctionne pas.

Que dois-je faire à la place?

57
jmasterx
read n
if ! ((n % 4)); then
    echo "$n divisible by 4."
fi

L'opérateur (( )) Évalue les expressions en arithmétique C et a un retour booléen.

Par conséquent, (( 0 )) Est faux et (( 1 )) Est vrai. [1]

L'opérateur $(( )) développe également les expressions arithmétiques C, mais au lieu de renvoyer true/false, il renvoie la valeur à la place. Pour cette raison, vous pouvez tester la sortie si $(( )) de cette façon: [2]

[[ $(( n % 4 )) == 0 ]]

Mais cela équivaut à: if (function() == false). Ainsi, le test le plus simple et le plus idiomatique est:

! (( n % 4 ))

[1]: Bash moderne gère les nombres jusqu'à la taille intmax_t De votre machine.

[2]: Notez que vous pouvez déposer $ À l'intérieur de (( )), Car il déréférence les variables à l'intérieur.

107
guns

crochets simples ([..]) ne fonctionne pas pour certains tests, essayez avec des crochets doubles ([[...]]) et enfermez le mod dans ((..)) pour évaluer le % opérateur correctement:

if [[ $(( $1 % 4 )) == 0 ]]; then

Plus de détails ici:
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_02.html

9
chown
a=4
if [ $(( $a % 4 )) -eq 0 ]; then                                
     echo "I'm here"
fi
9
Jan Vorcak

Cela pourrait fonctionner pour vous:

((a%4==0)) && echo "$a is divisible by 4" || echo "$a is not divisible by 4"

ou plus succinctement:

((a%4)) && echo "$a is not divisible by 4" || echo "$a is divisible by 4"
3
potong