มีเครื่องมือ UNIX มาตรฐานเพื่อทำซ้ำคำสั่งจำนวนครั้งหรือไม่?


13

นี่อาจเป็นเรื่องง่าย แต่มีวิธีง่ายๆในการเขียนคำสั่งหนึ่งครั้งในคอนโซลและมีnเวลาดำเนินการที่ไหนที่nระบุไว้ในรันไทม์? บางสิ่งเช่นนี้

repeat 100 echo hello

มีคำสั่งดังกล่าวอยู่หรือไม่ (สมมติว่ามีการติดตั้ง Linux ทั่วไป)

หรือฉันจะเขียนเพื่อทำวนรอบบางอย่างในทุบตี?

คำตอบ:


23

ใช่มันเป็นไปได้ Bash มีภาษาสคริปต์ที่กว้างขวางมาก ในกรณีนี้:

for i in {1..100}; do echo 'hello'; done

ตัวอย่างการวนซ้ำเพิ่มเติม: http://www.cyberciti.biz/faq/bash-for-loop/
การอ้างอิง bash แบบเต็ม: http://www.gnu.org/software/bash/manual/bashref.html


จะเกิดอะไรขึ้นเมื่อคำสั่งล้มเหลว
maazza

การจัดการข้อผิดพลาดของคุณจะจับและทำสิ่งที่ต้องทำแทน
Xyon

ฉันพยายามfor i in {1..100}; do python3 foo.py ; doneและตั้งใจจริง ๆ เพื่อให้ได้เวลาดำเนินการ (เพื่อดูว่าเร็วแค่ไหน) time for i in {1..100}; do python3 foo.py ; doneแล้ว CTRL-C จะไม่สามารถหยุดลูปได้
nonopolarity

3

หรือฉันจะเขียนเพื่อทำวนรอบบางอย่างในทุบตี?

ใช่คุณต้องการเช่นนี้:

for(( i = 0; i < 100; i++ )); do echo "hello"; done

หรือสั้นกว่า:

for((i=100;i--;)); do echo "hello"; done

จากนั้นใส่สิ่งนั้นลงในฟังก์ชั่นและ voila คุณมีคำสั่งของคุณ: repeat () {for_stuff_here; ทำ "$ @"; เสร็จสิ้น}
akira

3

นอกเหนือจากวิธีการที่มีอยู่แล้วภายในคุณสามารถใช้ยูทิลิตีภายนอกที่สร้างลำดับของตัวเลขได้

# gnu coreutils provides seq
for i in $(seq 1 100) ; do printf "hello\n" ; done

# freebsd (and probably other bsd) provides jot
for i in $(jot - 1 100) ; do printf "hello\n" ; done


2

ฉันไม่พบเครื่องมือ Linux "มาตรฐาน" ในการทำงานนี้ แต่ฉันมักจะสงวนจุดไฟล์ของฉัน (.bashrc, .vimrc เป็นต้น) จากการติดตั้งไปยังการติดตั้งดังนั้นต่อไปนี้จะสวย "มาตรฐาน" ถ้าคุณดูจาก มุมมองของการเก็บรักษาจุดไฟล์ของคุณในการติดตั้งใหม่:

ในตอนท้ายของ. bashrc หรือ. bash_aliases ของคุณให้ใส่คำจำกัดความต่อไปนี้:

repeat() {
  n=$1    #gets the number of times the succeeding command needs to be executed
  shift   #now $@ has the command that needs to be executed
  while [ $(( n -= 1 )) -ge 0 ]    #loop n times;
  do
    "$@"    #execute the command; you can also add error handling here or parallelize the commands
  done
}

บันทึกไฟล์และเปิดเชลล์อีกครั้งหรือดำเนินการsource /path/to/.bashrcหรือsource /path/to/.bash_aliasesไม่ว่าคุณจะเลือกแก้ไขไฟล์ใดในเชลล์ที่มีอยู่

แค่นั้นแหละ! คุณควรจะสามารถใช้มันในลักษณะดังต่อไปนี้:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

เป็นต้น


ดี มันจะเป็นการดีถ้าวาง "local" ไว้ข้างหน้า n = $ 1 เพื่อหลีกเลี่ยงการสร้างมลภาวะเนมสเปซตัวแปรทั่วโลก
Don Hatch

0

ขณะนี้ไม่มีคำตอบอื่นใดที่ใช้เครื่องมือ Unix มาตรฐานซึ่งเป็นคำถามที่ถามชื่อ

พวกเขาทั้งหมดใช้คำสั่งที่ไม่ได้มาตรฐาน ( seqหรือjot) หรือส่วนขยายของเชลล์ (การforวนรอบC-style หรือการขยายรั้ง) นั่นคือพวกเขาทั้งหมดล้มเหลวในการติดกับมาตรฐาน POSIX

นี่เป็นวิธีพกพาที่ควรใช้กับ POSIX เชลล์และระบบปฏิบัติการใด ๆ :

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.