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 10là 8, 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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.