วิธีการสร้างช่วงที่มีขั้นตอน n ในทุบตี? (สร้างลำดับของตัวเลขพร้อมส่วนเพิ่ม)


143

วิธีที่จะทำซ้ำในช่วงทุบตีคือ

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

สิ่งที่จะเป็นไวยากรณ์สำหรับการวนซ้ำในลำดับที่มีขั้นตอนหรือไม่ บอกเด็ก ๆ ว่าฉันต้องการได้เลขคู่ในตัวอย่างด้านบน


แม้กระทั่งตัวเลขให้คูณ i ด้วย 2: P
Joey Robert

คูณค่อนข้างน่าเกลียดผมควรจะพูด
SilentGhost

2
@ Omnifarious ฉันจะไม่แน่ใจ OS X ยังคงมาพร้อมกับ 3.2 เช่น ฉันจะบอกว่าห่วงสไตล์ C ควรได้รับการยอมรับ
Eli Korvigo

คำตอบ:


195

ฉันจะทำ

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

(แม้ว่าแน่นอนseq 0 2 10จะผลิตผลลัพธ์เดียวกันด้วยตัวเอง)

โปรดทราบว่าseqอนุญาตให้มีจำนวนจุดลอยตัว (เช่นseq .5 .25 3.5) แต่การขยายรั้งของ bash อนุญาตเฉพาะจำนวนเต็มเท่านั้น


4
ฉันจะเสี่ยงเดาว่า downvote เกิดจากคำตอบของคุณเป็น 'sh' และไม่ใช่เฉพาะ 'bash' วิธีการทุบตีบริสุทธิ์ {เริ่มต้นขั้นตอนสุดท้าย} มีประสิทธิภาพที่ดีขึ้นเล็กน้อยวิธีเก่า 'seq' มีประโยชน์ในระบบเก่าหรือหน่วยความจำขนาดเล็กเช่น busybox ฉันโหวตขึ้นทั้งคำตอบของคุณและ TheBawai :)
Scott Prive

6
ต้องการ $ (... ) ถึง backquotes Backquotes ไม่ทำรังอย่างดี
รอบรู้

seq 1000000 10,00010 จะลอยเท่านั้นจริงๆแล้ว - ไม่มีวิธีที่จะทำให้มันเป็นจำนวนเต็ม! งานขยายตัวของรั้ง
hmijail mourns ลาออก

112

การขยายรั้งของBash 4มีคุณสมบัติขั้นตอน:

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

ไม่ว่า Bash 2/3 (สไตล์ C สำหรับลูปดูคำตอบด้านบน) หรือ Bash 4 ฉันต้องการอะไรมากกว่าคำสั่ง 'seq'


1
และ btw คุณรู้หรือไม่ว่า bash4 เป็นค่าเริ่มต้นในระบบปฏิบัติการหลัก ๆ
SilentGhost

3
Bash4 ยังคงไม่สำคัญไม่ใช่ ทำไมไม่ลองดูล่ะ สมมุติว่าคำพูดของ bot ในช่อง IRC #bash: "seq (1) เป็นคำสั่งภายนอกที่ไม่ได้มาตรฐานที่ใช้ในการนับถึง 10 ใน silly Linux howtos"
TheBbean

ความเข้าใจของฉันคือ seq เป็นส่วนหนึ่งของ coreutils มาตรฐานคืออะไร การขัดแย้ง? ขอบคุณสำหรับความช่วยเหลือของคุณ.
SilentGhost

4
ข้อโต้แย้งเหล่านี้อาจมีหรือไม่มีความหมายสำหรับคุณ: * มีระบบเพียงพอโดยไม่มี GNU coreutils (แต่ติดตั้ง Bash) * คุณสร้างกระบวนการภายนอกที่ไม่จำเป็น * คุณต้องพึ่งพาความคิดที่ว่า 'seq' ทั้งหมดทำในสิ่งที่ 'seq' ของคุณ * ไม่ได้มาตรฐานโดย ISO
TheBonsai

3
@ เบ็คหากขั้นตอนนั้นถูกเก็บไว้ในตัวแปรiคุณไม่สามารถทำได้for {0..10..${i}}.. มันล้มเหลว
Nehal J Wani

72

Pure Bash โดยไม่มีกระบวนการพิเศษ:

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

10
+1 เนื่องจากขั้นตอนสามารถถูกแทนที่ด้วยตัวแปรได้เช่นกัน
Nehal J Wani

1
ฉันคิดว่านี่เป็นสิ่งที่คนส่วนใหญ่ต้องการ - วิธีง่ายๆในการวนซ้ำด้วยค่าขั้นตอนที่กำหนด มันฟังดูง่ายกว่าคำตอบทั้งหมดของ seq และเป็นไวยากรณ์ที่ชัดเจนกว่าการขยายตัวของ Bash4 และดูเหมือนว่าจะอนุญาตให้ใช้กับตัวแปร (ฉันไม่ได้ลองเลย
tobylaroni

ทำงานใน Bash 3 ซึ่งแตกต่างจากคำตอบของ @ TheBonsai
srcerer

มันยังช่วยแก้ไขตัวแปร ((i = "$ first"; i <= "$ last"; i + = "$ step")) ไม่ใช่เรื่องง่ายด้วยวงเล็บปีกกาและ seq
Blaa_Thor

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

seq เป็นคำสั่ง Linux สิ่งนี้จะไม่สามารถใช้ได้ใน Mac OS X หรือ FreeBSD
Dereckson

5
FWIW seq มีให้บริการใน OS X Mavericks มาตรฐาน 10.9.1 ของฉัน
Mark Setchell

ฉันได้ลอง sintax อื่น ๆ แต่นั่นเป็นเพียงการทำงานของฉันใน CentOS เล็กน้อย @z - ได้บันทึกวันของฉัน: D
m3nda

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.