Czy istnieje standardowe narzędzie UNIX do powtarzania polecenia dowolną liczbę razy?


11

Jest to prawdopodobnie bardzo łatwe, ale czy istnieje prosty sposób na napisanie komendy raz w konsoli i wykonanie jej nrazy, gdzie njest określona w czasie wykonywania? Coś takiego:

repeat 100 echo hello

Czy takie polecenie istnieje (zakładając typową instalację systemu Linux)?

A może napisałbym, żeby zrobić jakąś pętlę w bash?

Odpowiedzi:



3

A może napisałbym, żeby zrobić jakąś pętlę w bash?

Tak, chciałbyś:

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

lub krócej:

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

a następnie umieść te funkcje w funkcji i voila, masz swoje polecenie: repeat () {for_stuff_here; wykonaj „$ @”; gotowe}
akira

3

Oprócz bardziej wbudowanych metod można użyć zewnętrznego narzędzia, które generuje ciąg liczb.

# 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

Nie znalazłem „standardowego” narzędzia Linux do wykonania tego zadania, ale zwykle zachowuję swoje pliki kropek (.bashrc, .vimrc itp.) Od instalacji do instalacji, więc poniższe informacje są dość „standardowe”, jeśli spojrzy się na to z perspektywa zachowania plików kropek w nowych instalacjach:

Na końcu pliku .bashrc lub .bash_aliases wpisz następującą definicję:

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
}

Zapisz plik i ponownie otwórz powłokę lub uruchom source /path/to/.bashrclub source /path/to/.bash_aliases, zależnie od tego, co wybierzesz do modyfikacji, w istniejącej powłoce.

Otóż ​​to! Powinieneś być w stanie używać go w następujący sposób:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

itp.


miły. dobrze byłoby umieścić „lokalny” przed n = 1 $, aby uniknąć zanieczyszczenia przestrzeni nazw zmiennych globalnych
Don Hatch,

1

Składnia pętli for jest głupia. To jest krótsze:

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

0

Obecnie żadna z pozostałych odpowiedzi nie używa standardowych narzędzi uniksowych, o które pyta tytułowe pytanie.

Wszystkie używają niestandardowych poleceń ( seqlub jot) lub rozszerzeń powłoki (rozwinięcie forpętli w stylu C lub nawias klamrowy), tzn. Wszystkie nie są zgodne ze standardem POSIX.

Oto przenośny sposób, który powinien działać z dowolną powłoką i systemem operacyjnym zgodnym z POSIX:

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.