Komutu istediğiniz kadar tekrarlamak için standart bir UNIX aracı var mı?


13

Bu muhtemelen çok kolay, ancak bir kez konsolda bir komut yazmanın ve çalıştırma nzamanında çalıştırmanın basit bir yolu var nmı? Bunun gibi bir şey:

repeat 100 echo hello

Böyle bir komut var mı (tipik Linux kurulumunu varsayalım)?

Yoksa bash'da bir çeşit döngü yapmak için yazabilir miyim?

Yanıtlar:


23

Evet bu mümkün. Bash çok kapsamlı bir betik diline sahiptir. Bu durumda:

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

Daha fazla döngü örneği: http://www.cyberciti.biz/faq/bash-for-loop/
Tam bash referansı: http://www.gnu.org/software/bash/manual/bashref.html


komut başarısız olduğunda ne olur?
maazza

Hata işlemeniz onu yakalar ve bunun yerine ne yapılacağını belirler.
Xyon

Ben denedim for i in {1..100}; do python3 foo.py ; doneve aslında (ne kadar hızlı görmek için) yürütme süresi almak demek time for i in {1..100}; do python3 foo.py ; doneve sonra CTRL-C döngü durmak mümkün olmayacaktır
nonopolarity

3

Yoksa bash'da bir çeşit döngü yapmak için yazabilir miyim?

Evet, şöyle:

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

veya daha kısa:

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

ve sonra bir şeyler ve voila içine koymak, komut var: repeat () {for_stuff_here; "$ @" yapın; done}
akira

3

Daha yerleşik yöntemlere ek olarak, bir dizi sayı üreten harici bir yardımcı program kullanabilirsiniz.

# 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

For döngüsü sözdizimi saçmadır. Bu daha kısa:

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

2

Bu işi yapmak için "standart" bir Linux aracı bulamadım, ancak genellikle kurulumumdan kuruluma nokta dosyalarımı (.bashrc, .vimrc vb.) Korudum, bu nedenle aşağıdaki noktalara bakarsanız oldukça "standart" dot dosyalarınızı yeni kurulumlarda koruma perspektifi:

.Bashrc veya .bash_aliases öğesinin sonuna aşağıdaki tanımı girin:

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
}

Dosyayı kaydedin ve kabuğu yeniden açın veya mevcut bir kabukta source /path/to/.bashrcveya source /path/to/.bash_aliaseshangisini değiştirmeyi seçerseniz seçin.

Bu kadar! Aşağıdaki şekilde kullanabilmelisiniz:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

vb.


Güzel. küresel değişken ad alanını kirletmemek için n = 1 $ önüne "yerel" koymak iyi olur
Don Hatch

0

Şu anda, diğer cevapların hiçbiri başlık sorusunun istediği standart Unix araçlarını kullanmıyor.

Hepsi standart olmayan komutlar ( seqveya jot) veya kabuk uzantıları (C stili fordöngü veya küme ayracı genişletme) kullanır, yani hepsi POSIX standardına uymaz.

POSIX uyumlu herhangi bir kabuk ve işletim sistemiyle çalışması gereken taşınabilir bir yol:

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.