194 votes

Comment utiliser l'opérateur mod en bash ?

J'essaie une ligne comme celle-ci :

for i in {1..600}; do wget http://example.com/search/link $i % 5; done;

Ce que j'essaie d'obtenir comme résultat est :

wget http://example.com/search/link0
wget http://example.com/search/link1
wget http://example.com/search/link2
wget http://example.com/search/link3
wget http://example.com/search/link4
wget http://example.com/search/link0

Mais ce que j'obtiens en fait est juste :

    wget http://example.com/search/link

274voto

Mark Longair Points 93104

Essayez ce qui suit :

 for i in {1..600}; do echo wget http://example.com/search/link$(($i % 5)); done

El $(( )) la syntaxe fait un évaluation arithmétique du contenu.

8 votes

Si quelqu'un en a besoin pour des opérations mathématiques, notez que opération modulo avec des nombres négatifs en bash ne renvoie que le reste , non mathématique modulo résultat. Cela signifie que, bien que mathématiquement -12 mod 10 est 8 bash le calculera comme -2 . Vous pouvez le tester avec un simple echo $((-12 % 10)) ( -2 ) et le comparer avec python3 python3 -c "print(-12 % 10)" ( 8 ).

8 votes

N'oubliez pas que la construction arithmétique $(()) développera automatiquement les variables, de sorte que vous n'aurez pas besoin de l'option $ avec le i . Ce site $((i % 5)) fonctionnera parfaitement bien.

49voto

Chris Points 19350
for i in {1..600}
do
    n=$(($i%5))
    wget http://example.com/search/link$n
done

1 votes

Le signe $ à l'intérieur de la double parenthèse n'est pas nécessaire, car bash développera automatiquement toute variable qu'il y trouvera.

31voto

Higor Eurípedes Points 331

Vous devez placer vos expressions mathématiques à l'intérieur de $(( )).

Un seul mot :

for i in {1..600}; do wget http://example.com/search/link$(($i % 5)); done;

Lignes multiples :

for i in {1..600}; do
    wget http://example.com/search/link$(($i % 5))
done

2 votes

Le signe $ à l'intérieur de la double parenthèse n'est pas nécessaire, car bash développera automatiquement toute variable qu'il y trouvera.

14voto

hyh Points 338

C'est peut-être hors sujet. Mais pour le wget dans la boucle for, vous pouvez certainement faire

curl -O http://example.com/search/link[1-600]

0voto

Glenn J. Schworak Points 271

Cet article est assez ancien mais j'ai pensé y contribuer car je suis tombé dessus en essayant de faire des recherches sur le même problème de réglage de la couleur du clavier par l'automatisation.

J'ai créé un simple BASH script que j'appelle depuis mon Root chrontab toutes les minutes pour définir la couleur du clavier au fur et à mesure que la journée avance. Vous pouvez modifier les motifs de couleur et le modulo pour répondre à vos besoins. Ceci est juste un bon point de départ.

#!/bin/bash
# must run as ROOT to work
# put in your root crontab to change the color at set times

sec=$(date +%s)
min=$(( $sec / 60 ))
col=$(( $min % 7 ))
colors=('0000FF' '00FF00' '00FFFF' 'FF0000' 'FF00FF' 'FFFF00' 'FFFFFF')
colorFile="/sys/class/leds/system76_acpi::kbd_backlight/color"

if [ -f "$colorFile" ]; then
    echo "Set keyboard to color $col ~ ${colors[$col]}"
    echo "${colors[$col]}" > "$colorFile"
fi

J'espère que vous l'apprécierez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X