Bagaimana cara menggunakan mod operator di bash?

168

Saya mencoba garis seperti ini:

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

Apa yang saya coba dapatkan sebagai output adalah:

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

Tapi yang saya dapatkan sebenarnya hanya:

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

Jawaban:

234

Coba yang berikut ini:

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

The $(( ))sintaks tidak sebuah evaluasi aritmatika dari isi.

Mark Longair
sumber
4
Jika seseorang membutuhkan ini untuk operasi matematika, perhatikan bahwa operasi modulo dengan angka negatif sebagai bash imbalannya hanya tersisa , bukan hasil modulo matematika . Ini berarti, bahwa sementara matematis -12 mod 10adalah 8, bash akan menghitung sebagai -2. Anda dapat mengujinya dengan sederhana echo $((-12 % 10))( -2) dan membandingkannya dengan python3 python3 -c "print(-12 % 10)"( 8).
Lirt
1
Jangan lupa bahwa konstruk aritmatika $(())akan secara otomatis memperluas variabel sehingga Anda tidak perlu $menggunakan i. Ini $((i % 5))akan bekerja dengan sangat baik.
Yokai
41
for i in {1..600}
do
    n=$(($i%5))
    wget http://example.com/search/link$n
done
Chris Eberle
sumber
30

Anda harus meletakkan ekspresi matematika Anda di dalam $ (()).

Satu-liner:

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

Beberapa baris:

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

Ini mungkin di luar topik. Tetapi untuk wget in for loop, Anda tentu bisa melakukannya

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