Đoạn mã for-loop của bạn không hoạt động như bạn yêu cầu vì hai lý do:
(($i += 5))
- ở đây $i
được mở rộng đến giá trị của i
. Do đó, việc mở rộng sẽ là một cái gì đó giống như ((375 += 5))
, điều này không có ý nghĩa (cố gắng gán một số bằng chữ cho một số theo nghĩa đen khác). Điều này thường sẽ đạt được với ((i += 5))
(không $
để mở rộng biến)
- Các
{375..3500}
sẽ được mở rộng trước khi phiên đầu tiên của vòng lặp. Nó sẽ là danh sách các số 375 376 ... 3499 3500
. Đối với mỗi lần lặp của vòng lặp, i
sẽ được gán cho từng số này, từng số một. Do đó, khi bắt đầu mỗi lần lặp, i
sẽ được gán lại cho giá trị tiếp theo trong danh sách đó, đếm theo các bước của 1. Hiệu ((i += 5))
quả không làm gì cả - nó thêm 5 vào i, nhưng sau đó tôi chỉ được gán lại khi bắt đầu lần lặp tiếp theo.
Tôi nghĩ rằng tôi thích for (( ; ; ))
câu trả lời nhất, nhưng đây là một số lựa chọn thay thế để bạn suy nghĩ:
Vì chúng tôi đang xử lý bội số của 5 và việc {a..b..i}
mở rộng không được hỗ trợ trong phiên bản bash 3.2.57 (1) (trong OS X), nên chúng tôi có thể thực hiện điều này hơi phức tạp:
for i in 375 {38..349}{0,5} 3500; do
echo $i
done
Điều này cho thấy cách bash có thể được sử dụng để tạo ra một sản phẩm cartesian.
Tôi nghĩ nói chung, vòng lặp for là cách thuận tiện nhất để thực hiện việc này, nhưng nếu bạn quan tâm, bạn có thể sử dụng chương trình vòng lặp while (gần hơn một chút với BASIC) của bạn:
count=375
while (( count <= 3500 )); do
echo $count
(( count += 5 ))
done