명령을 여러 번 반복하는 표준 UNIX 도구가 있습니까?


11

이것은 아마도 쉬운 일이 아니지만 콘솔에서 명령을 한 번 작성하고 실행 n시간을 n지정 하는 간단한 방법이 있습니까? 런타임에 지정되어 있습니까? 이 같은:

repeat 100 echo hello

이러한 명령이 존재합니까 (일반 Linux 설치를 가정)?

아니면 bash에서 일종의 루프를 작성하도록 작성 하시겠습니까?

답변:



3

아니면 bash에서 일종의 루프를 작성하도록 작성 하시겠습니까?

예, 다음과 같이하십시오.

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

또는 더 짧게 :

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

그런 다음 해당 내용을 함수와 voila에 넣으십시오. repeat () {for_stuff_here; "$ @"을하십시오; done}
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

기타


좋은. 전역 변수 네임 스페이스의 오염을 피하기 위해 n = $ 1 앞에 "local"을 두는 것이 좋습니다
Don Hatch

1

for 루프 구문은 바보입니다. 이것은 더 짧습니다 :

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

0

현재 다른 답변은 제목 질문이 요구하는 표준 Unix 도구를 사용하지 않습니다.

그들은 모두 비표준 명령 ( seq또는 jot) 또는 쉘 확장 (C 스타일 for루프 또는 중괄호 확장)을 사용합니다. 즉, 모두 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.