Comment utiliser l'opérateur mod dans bash?

168

J'essaye 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 en sortie, c'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 je reçois en fait, c'est juste:

    wget http://example.com/search/link
Eric
la source

Réponses:

234

Essayez ce qui suit:

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

La $(( ))syntaxe effectue une évaluation arithmétique du contenu.

Mark Longair
la source
4
Si quelqu'un en a besoin pour des opérations mathématiques, notez que l' opération modulo avec des nombres négatifs dans les bash retours ne renvoie que le reste , et non le résultat modulo mathématique . Cela signifie, que si mathématiquement -12 mod 10est 8, bash calculera comme -2. Vous pouvez le tester avec simple echo $((-12 % 10))( -2) et le comparer avec python3 python3 -c "print(-12 % 10)"( 8).
Lirt
1
Ne pas oublier que la construction arithmétique $(())augmentera automatiquement les variables afin que vous ne aurez pas besoin $avec le i. Cela $((i % 5))fonctionnera parfaitement bien.
Yokai
41
for i in {1..600}
do
    n=$(($i%5))
    wget http://example.com/search/link$n
done
Chris Eberle
la source
30

Vous devez mettre vos expressions mathématiques dans $ (()).

Bon mot:

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

Plusieurs lignes:

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

Cela pourrait être hors sujet. Mais pour la boucle wget in for, vous pouvez certainement le faire

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