Có một công cụ UNIX tiêu chuẩn để lặp lại một lệnh bất kỳ số lần nào không?


13

Điều này có thể dễ chết, nhưng có một cách đơn giản để viết lệnh một lần trong bàn điều khiển và có nthời gian thực hiện không , nđược chỉ định ở đâu khi chạy? Một cái gì đó như thế này:

repeat 100 echo hello

Có lệnh như vậy tồn tại (giả sử cài đặt Linux điển hình)?

Hoặc tôi sẽ viết để làm một số loại vòng lặp trong bash?

Câu trả lời:


23

Vâng, điều này là có thể. Bash có một ngôn ngữ kịch bản rất rộng. Trong trường hợp này:

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

Các ví dụ lặp khác: http://www.cyberciti.biz/faq/bash-for-loop/
Tham chiếu bash đầy đủ: http://www.gnu.org/software/bash/manual/bashref.html


Điều gì xảy ra khi lệnh thất bại?
maazza

Xử lý lỗi của bạn nắm bắt nó và tìm ra những việc cần làm thay thế.
Xyon

Tôi đã cố gắng for i in {1..100}; do python3 foo.py ; donevà thực sự có nghĩa là để có được thời gian thực hiện (để xem nhanh như thế nào) time for i in {1..100}; do python3 foo.py ; donevà sau đó CTRL-C sẽ không thể dừng vòng lặp
phân cực

3

Hoặc tôi sẽ viết để làm một số loại vòng lặp trong bash?

Vâng, bạn sẽ, như thế này:

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

hoặc, ngắn hơn:

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

và sau đó đặt nội dung đó vào một hàm và voila, bạn có lệnh của mình: repeat () {for_ ware_here; làm "$ @"; xong}
akira

3

Ngoài các phương thức được xây dựng nhiều hơn, bạn có thể sử dụng một tiện ích bên ngoài tạo ra một chuỗi số.

# 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

3

Cú pháp vòng lặp for là ngớ ngẩn. Cái này ngắn hơn:

seq 10|xargs -I INDEX echo "print this 10 times"

2

Tôi không tìm thấy công cụ Linux "chuẩn" để thực hiện công việc này, nhưng tôi thường bảo toàn các tệp chấm của mình (.bashrc, .vimrc, v.v.) từ cài đặt đến cài đặt, vì vậy, đây là "tiêu chuẩn" khá tốt nếu bạn nhìn vào nó từ phối cảnh bảo quản các tập tin dấu chấm của bạn trong các bản cài đặt mới:

Khi kết thúc .bashrc hoặc .bash_aliases của bạn, hãy đặt định nghĩa sau:

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
}

Lưu tệp và mở lại trình bao hoặc thực thi source /path/to/.bashrchoặc source /path/to/.bash_aliases, bất cứ điều gì bạn chọn để sửa đổi, trong một trình bao hiện có.

Đó là nó! Bạn sẽ có thể sử dụng nó theo cách sau:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

Vân vân.


đẹp. sẽ tốt hơn nếu đặt "cục bộ" trước n = $ 1, để tránh gây ô nhiễm không gian tên biến toàn cầu
Don Hatch

0

Hiện tại, không có câu trả lời nào khác đang sử dụng các công cụ Unix tiêu chuẩn, đó là những gì câu hỏi tiêu đề đang yêu cầu.

Tất cả đều sử dụng các lệnh không chuẩn ( seqhoặc jot) hoặc phần mở rộng shell ( forvòng lặp kiểu C hoặc mở rộng dấu ngoặc), tức là tất cả chúng đều không tuân theo tiêu chuẩn POSIX.

Đây là một cách di động nên hoạt động với mọi hệ điều hành và hệ vỏ tương thích POSIX:

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
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.