Làm thế nào để sử dụng toán tử mod trong bash?


168

Tôi đang thử một dòng như thế này:

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

Những gì tôi đang cố gắng để có được như là đầu ra là:

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

Nhưng những gì tôi thực sự nhận được chỉ là:

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

Câu trả lời:


234

Hãy thử như sau:

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

Các $(( ))cú pháp không một đánh giá số học của nội dung.


4
Nếu ai đó cần này cho các hoạt động toán học, lưu ý rằng phép toán module với số âm trong bash lợi nhuận chỉ còn lại , không modulo toán kết quả. Điều này có nghĩa, rằng trong khi về mặt toán học -12 mod 108, bash sẽ tính toán nó như là -2. Bạn có thể kiểm tra nó với đơn giản echo $((-12 % 10))( -2) và so sánh nó với python3 python3 -c "print(-12 % 10)"( 8).
Lirt

1
Đừng quên rằng cấu trúc số học $(())sẽ tự động mở rộng các biến để bạn không cần $với i. Điều này $((i % 5))sẽ hoạt động hoàn toàn tốt.
Yokai

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

30

Bạn phải đặt các biểu thức toán học của bạn bên trong $ (()).

Lót:

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

Nhiều dòng:

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

13

Điều này có thể lạc đề. Nhưng đối với wget in for loop, bạn chắc chắn có thể làm

curl -O http://example.com/search/link[1-600]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.