Como usar o operador mod no bash?

168

Estou tentando uma linha como esta:

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

O que estou tentando obter como saída é:

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

Mas o que realmente estou recebendo é apenas:

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

Respostas:

234

Tente o seguinte:

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

A $(( ))sintaxe faz uma avaliação aritmética do conteúdo.

Mark Longair
fonte
4
Se alguém precisa isso para operações matemáticas, nota que operação de módulo com números negativos em bash retornos somente restante , não modulo matemática resultado. Isso significa que, embora matematicamente -12 mod 10seja 8, o bash o calculará como -2. Você pode testá-lo com simple echo $((-12 % 10))( -2) e compará-lo com python3 python3 -c "print(-12 % 10)"( 8).
Lirt
1
Não se esqueça que a construção aritmética $(())expandirá automaticamente as variáveis, assim você não precisará da $com i. Isso $((i % 5))funcionará perfeitamente bem.
Yokai
41
for i in {1..600}
do
    n=$(($i%5))
    wget http://example.com/search/link$n
done
Chris Eberle
fonte
30

Você deve colocar suas expressões matemáticas dentro de $ (()).

Uma linha:

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

Várias linhas:

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

Isso pode estar fora do tópico. Mas para o wget in for loop, você certamente pode fazer

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