¿Cómo usar el operador mod en bash?

168

Estoy intentando una línea como esta:

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

Lo que intento obtener como salida es:

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

Pero lo que realmente estoy obteniendo es solo:

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

Respuestas:

234

Intenta lo siguiente:

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

La $(( ))sintaxis realiza una evaluación aritmética de los contenidos.

Mark Longair
fuente
44
Si alguien necesita esto para operaciones matemáticas, tenga en cuenta que la operación de módulo con números negativos en bash retornos solo devuelve el resto , no el resultado del módulo matemático . Esto significa que, aunque matemáticamente -12 mod 10es 8, bash lo calculará como -2. Puede probarlo con simple echo $((-12 % 10))( -2) y compararlo con python3 python3 -c "print(-12 % 10)"( 8).
Lirt
1
No olvide que la construcción aritmética $(())expandirá automáticamente las variables, por lo que no necesitará la $con i. Esto $((i % 5))funcionará perfectamente bien.
Yokai
41
for i in {1..600}
do
    n=$(($i%5))
    wget http://example.com/search/link$n
done
Chris Eberle
fuente
30

Debe poner sus expresiones matemáticas dentro de $ (()).

Un trazador de líneas:

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

Múltiples lineas:

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

Esto podría estar fuera de tema. Pero para wget in for loop, ciertamente puedes hacer

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