Làm thế nào để tạo ra một phạm vi với bước n trong bash? (tạo một chuỗi các số có số gia)


143

Cách để lặp lại một phạm vi trong bash là

for i in {0..10}; do echo $i; done

Điều gì sẽ là cú pháp để lặp qua chuỗi với một bước? Nói, tôi muốn chỉ nhận được số chẵn trong ví dụ trên.


Số chẵn, nhân i với 2 .: P
Joey Robert

phép nhân khá xấu xí, tôi nên nói
SilentGhost

2
@Omnifarious Tôi sẽ không chắc chắn như vậy. OS X vẫn đi kèm với 3.2, ví dụ. Tôi muốn nói rằng vòng lặp kiểu C nên được chấp nhận.
Eli Korvigo

Câu trả lời:


195

tôi sẽ làm

for i in `seq 0 2 10`; do echo $i; done

(mặc dù tất nhiên seq 0 2 10sẽ tự sản xuất cùng một đầu ra).

Lưu ý rằng seqcho phép số dấu phẩy động (ví dụ seq .5 .25 3.5:) nhưng mở rộng dấu ngoặc của bash chỉ cho phép số nguyên.


4
Tôi sẽ mạo hiểm đoán rằng downvote là do câu trả lời của bạn chung chung với 'sh' và không cụ thể cho 'bash'. Cách tiếp cận Bash thuần túy {bắt đầu bước cuối} thực hiện tốt hơn một chút. Phương pháp 'seq' cũ hơn tiện dụng trên các hệ thống bộ nhớ cũ hoặc nhỏ hơn như busybox. Tôi đã nâng cấp cả câu trả lời của bạn và TheBotto. :)
Scott Prive

6
Thích $ (...) cho backquote. Backquote không làm tổ hoàn toàn.
Omnifarious

seq 1000000 1000010 chỉ thực sự nổi, thực sự - không có cách nào để làm cho nó làm số nguyên! Niềng răng mở rộng hoạt động.
hmijail thương tiếc người từ chức

112

Mở rộng cú đúp của Bash 4 có một tính năng bước:

for {0..10..2}; do
  ..
done

Không có vấn đề gì nếu Bash 2/3 (kiểu C cho vòng lặp, xem câu trả lời ở trên) hoặc Bash 4, tôi sẽ thích mọi thứ hơn lệnh 'seq'.


1
và btw, bạn có biết bash4 là mặc định trên bất kỳ HĐH chính nào không?
SilentGhost

3
Bash4 vẫn không phải là chủ đạo, không. Tại sao không seq? Chà, hãy nói nó với những từ của bot trong kênh IRC #bash: "seq (1) là một lệnh bên ngoài không đạt tiêu chuẩn cao được sử dụng để đếm đến 10 trong howtos Linux ngớ ngẩn."
TheBotto

sự hiểu biết của tôi là seq là một phần của coreutils. không chuẩn về nó là gì? tranh luận? Cảm ơn bạn đã giúp đỡ.
SilentGhost

4
Các đối số này có thể hoặc không thể tính cho bạn: * có đủ hệ thống mà không có lõi GNU (nhưng đã cài đặt Bash) * bạn tạo một quy trình bên ngoài không cần thiết * bạn dựa vào ý tưởng rằng tất cả 'seq' làm những gì 'seq' của bạn làm * đó là không được tiêu chuẩn hóa bởi ISO
TheBotto

3
@becko Nếu bước được lưu trữ trong biến i, thì bạn không thể làm for {0..10..${i}}.. nó thất bại.
Nehal J Wani

72

Bash thuần túy, không có quá trình bổ sung:

for (( COUNTER=0; COUNTER<=10; COUNTER+=2 )); do
    echo $COUNTER
done

10
+1 Vì bước này cũng có thể được thay thế bằng một biến.
Nehal J Wani

1
Tôi nghĩ rằng đây thực sự là điều mà hầu hết mọi người có thể muốn - một cách đơn giản để thực hiện một vòng lặp với giá trị bước quy định. Nghe có vẻ đơn giản hơn tất cả các câu trả lời dựa trên seq và là một cú pháp rõ ràng hơn so với mở rộng cú đúp Bash4 và có vẻ như nó sẽ cho phép các biến (tôi đã không thử điều đó, nhưng cú pháp chắc chắn gợi ý điều đó).
tobylaroni

Hoạt động trong Bash 3, không giống như câu trả lời của @ TheBotto.
thầy phù thủy

Nó thậm chí còn giải quyết biến, ((i = "$ đầu tiên"; i <= "$ cuối cùng"; i + = "$ step")). Không quá dễ dàng với niềng răng xoăn và seq.
Blaa_Thor

20
#!/bin/bash
for i in $(seq 1 2 10)
do
   echo "skip by 2 value $i"
done

seq là một lệnh Linux. Điều này sẽ không có sẵn trên Mac OS X hoặc FreeBSD.
Dereckson

5
FWIW seq khả dụng trong OS X Mavericks 10.9.1 tiêu chuẩn của tôi
Mark Setchell

Tôi đã thử một số sintax khác, nhưng đó là cách duy nhất làm việc cho tôi trên một CentOS nhỏ. @z - đã lưu lại ngày của tôi: D
m3nda

3
> seq 4
1
2
3
4

> seq 2 5
2
3
4
5

> seq 4 2 12
4
6
8
10
12

> seq -w 4 2 12
04
06
08
10
12

> seq -s, 4 2 12
4,6,8,10,12
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.