¿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

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.


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

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

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]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.