Apakah ada alat UNIX standar untuk mengulangi perintah beberapa kali?

13

Ini mungkin mudah mati, tetapi adakah cara sederhana untuk menulis perintah sekali di konsol, dan menjalankannya nkali, di mana nditentukan saat runtime? Sesuatu seperti ini:

repeat 100 echo hello

Apakah ada perintah seperti itu (anggap instalasi Linux biasa)?

Atau akankah saya menulis untuk melakukan semacam loop di bash?

Jørn Schou-Rode
sumber

Jawaban:

23

Ya ini mungkin. Bash memiliki bahasa scripting yang sangat luas. Pada kasus ini:

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

Lebih banyak contoh perulangan: http://www.cyberciti.biz/faq/bash-for-loop/
Referensi bash lengkap: http://www.gnu.org/software/bash/manual/bashref.html

alumb
sumber
apa yang terjadi ketika perintah gagal?
maazza
Penanganan kesalahan Anda menangkapnya dan mencari tahu apa yang harus dilakukan.
Xyon
Saya mencoba for i in {1..100}; do python3 foo.py ; donedan sebenarnya bermaksud untuk mendapatkan waktu eksekusi (untuk melihat seberapa cepat) time for i in {1..100}; do python3 foo.py ; donedan kemudian CTRL-C tidak akan dapat menghentikan loop
nonopolarity
3

Atau akankah saya menulis untuk melakukan semacam loop di bash?

Ya, Anda mau, seperti ini:

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

atau, lebih pendek:

for((i=100;i--;)); do echo "hello"; done
Michael Borgwardt
sumber
dan kemudian memasukkan hal-hal itu ke dalam fungsi dan voila, Anda memiliki perintah: repeat () {for_stuff_here; lakukan "$ @"; selesai}
akira
3

Selain metode yang lebih bawaan Anda bisa menggunakan utilitas eksternal yang menghasilkan urutan angka.

# 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
phogg
sumber
3

Sintaks untuk loop adalah konyol. Ini lebih pendek:

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

Saya tidak menemukan alat Linux "standar" untuk melakukan pekerjaan ini, tapi saya biasanya menyimpan file dot saya (.bashrc, .vimrc dll.) Dari instalasi ke instalasi, jadi berikut ini cukup "standar" jika Anda melihatnya dari perspektif melestarikan file dot Anda dalam instalasi baru:

Di akhir .bashrc atau .bash_aliases Anda, masukkan definisi berikut:

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
}

Simpan file dan buka kembali shell atau jalankan source /path/to/.bashrcatau source /path/to/.bash_aliases, mana pun yang Anda pilih untuk dimodifikasi, dalam shell yang ada.

Itu dia! Anda harus dapat menggunakannya dengan cara berikut:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

dll.

Rovin Bhandari
sumber
bagus. akan lebih baik untuk menempatkan "lokal" di depan n = $ 1, untuk menghindari mencemari namespace variabel global
Don Hatch
0

Saat ini, tidak ada jawaban lain yang menggunakan alat Unix standar yang merupakan pertanyaan judul yang ditanyakan.

Mereka semua menggunakan perintah non-standar ( seqatau jot) atau ekstensi shell ( forloop gaya-C atau ekspansi brace), yaitu semuanya gagal memenuhi standar POSIX.

Berikut ini adalah cara portabel yang harus bekerja dengan semua shell yang sesuai dengan POSIX dan sistem operasi:

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
Jlliagre
sumber