programing

bash에서 명령어를 N번 실행하는 더 좋은 방법이 있나요?

telebox 2023. 4. 17. 21:40
반응형

bash에서 명령어를 N번 실행하는 더 좋은 방법이 있나요?

다음과 같은 bash 명령줄을 실행하는 경우가 있습니다.

n=0; while [[ $n -lt 10 ]]; do some_command; n=$((n+1)); done

some_command열 살, 열 살

★★★some_command명령어 연쇄나 파이프라인이라고 할 수 있습니다.

좀 더 간결한 방법이 있을까요?

범위에 변수가 있는 경우 다음과 같이 사용합니다.

count=10
for i in $(seq $count); do
    command
done

심플:

for run in {1..10}; do
  command
done

또는 쉽게 복사하여 붙여넣기를 원하는 사용자를 위해 한 줄짜리 라이너로 다음과 같이 하십시오.

for run in {1..10}; do command; done

상수 사용:

for ((n=0;n<10;n++)); do
    some_command; 
done

변수 사용(산술 식 포함):

x=10; for ((n=0; n < (x / 2); n++)); do some_command; done

또 다른 간단한 해킹 방법:

seq 20 | xargs -Iz echo "Hi there"

에코를 20회 실행합니다.


「 」라는 점에 해 주세요.seq 20 | xargs -Iz echo "Hi there z"★★★★

하세요 1★★★★★★★★★★★★★★★1
하세요 2시 2분

zsh 쉘을 사용하는 경우:

repeat 10 { echo 'Hello' }

여기서 10은 명령어를 반복하는 횟수입니다.

GNU Parallel을 사용하면 다음 작업을 수행할 수 있습니다.

parallel some_command ::: {1..1000}

숫자를 인수로 사용하지 않고 한 번에 하나의 작업만 실행하는 경우:

parallel -j1 -N0 some_command ::: {1..1000}

소개 비디오에 대해서는, https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 를 참조해 주세요.

튜토리얼(http://www.gnu.org/software/parallel/parallel_tutorial.html)을 참조하십시오.당신은 그것에 대해 당신을 사랑하는 명령줄을 가지고 있습니다.

bash 「」)의 단순한 .~/.bashrc이치노릇을 하다

function runx() {
  for ((n=0;n<$1;n++))
    do ${*:2}
  done
}

이렇게 불러주세요.

$ runx 3 echo 'Hello world'
Hello world
Hello world
Hello world

정기적으로 정상인 경우 다음 명령을 실행하여 1초마다 무기한으로 실행할 수 있습니다.다른 커스텀 체크를 n회 실행할 수 있습니다.

watch -n 1 some_command

시각적으로 는, 「」를 붙여 주세요.--differences 앞서서ls명령어를 입력합니다.

OSX의 man 페이지에 따르면

--cumulative 옵션은 "sticky"를 강조 표시하여 변경된 모든 위치를 표시합니다.-t 또는 --no-title 옵션은 디스플레이 상단에 있는 간격, 명령 및 현재 시간을 나타내는 헤더와 다음 빈 줄을 끕니다.

Linux/Unix man 페이지는 여기에서 찾을 수 있습니다.

또 다른 형태의 예:

n=0; while (( n++ < 10 )); do some_command; done
for _ in {1..10}; do command; done   

변수를 사용하는 대신 밑줄에 주의하십시오.

xargs고속:

#!/usr/bin/bash
echo "while loop:"
n=0; time while (( n++ < 10000 )); do /usr/bin/true ; done

echo -e "\nfor loop:"
time for ((n=0;n<10000;n++)); do /usr/bin/true ; done

echo -e "\nseq,xargs:"
time seq 10000 | xargs -I{} -P1 -n1 /usr/bin/true

echo -e "\nyes,xargs:"
time yes x | head -n10000 |  xargs -I{} -P1 -n1 /usr/bin/true

echo -e "\nparallel:"
time parallel --will-cite -j1 -N0 /usr/bin/true ::: {1..10000}

최신 64비트 Linux에서는 다음과 같은 기능을 제공합니다.

while loop:

real    0m2.282s
user    0m0.177s
sys     0m0.413s

for loop:

real    0m2.559s
user    0m0.393s
sys     0m0.500s

seq,xargs:

real    0m1.728s
user    0m0.013s
sys     0m0.217s

yes,xargs:

real    0m1.723s
user    0m0.013s
sys     0m0.223s

parallel:

real    0m26.271s
user    0m4.943s
sys     0m3.533s

은 「이해」라고 것이 합니다.xargs는 '1'을하는 단일 네이티브프로세스입니다/usr/bin/truefor ★★★★★★★★★★★★★★★★★」while수줍음을 타다가 있는 , 이 수 .루프를 반복할 때마다 여러 명령어를 실행할 필요가 있는 경우에는 패스보다 고속으로 동작합니다.sh -c 'command1; command2; ...'xargs로

-P1예를 들어, "로 바꿀 수 있다"고 말했다.-P88개의 프로세스를 동시에 생성하여 속도를 크게 향상시킵니다.

GNU 병렬이 왜 이렇게 느린지 모르겠어요.나는 그것이 xargs에 필적할 것이라고 생각했을 것이다.

예를 들어, 다음과 같은 함수로 정리할 수 있습니다.

function manytimes {
    n=0
    times=$1
    shift
    while [[ $n -lt $times ]]; do
        $@
        n=$((n+1))
    done
}

다음과 같이 부릅니다.

$ manytimes 3 echo "test" | tr 'e' 'E'
tEst
tEst
tEst

xargs와 seq가 도움이 됩니다.

function __run_times { seq 1 $1| { shift; xargs -i -- "$@"; } }

뷰:

abon@abon:~$ __run_times 3  echo hello world
hello world
hello world
hello world

기존 답변은 모두 를 필요로 하며 표준 BSD UNIX에서는 동작하지 않습니다./bin/sh(예: OpenBSD).

다음 코드는 모든 BSD에서 작동합니다.

$ echo {1..4}
{1..4}
$ seq 4
sh: seq: not found
$ for i in $(jot 4); do echo e$i; done
e1
e2
e3
e4
$

이 루프로 해결했습니다. 여기서 repeat은 루프의 수를 나타내는 정수입니다.

repeat=10
for n in $(seq $repeat); 
    do
        command1
        command2
    done

이 명령을 사용하여 명령을 10회 이상 반복할 수 있습니다.

for i in {1..10}; do **your command**; done

예를들면

for i in {1..10}; do **speedtest**; done

또 다른 답은 다음과 같습니다.빈 파라미터에 파라미터 확장 사용:

# calls curl 4 times 
curl -s -w "\n" -X GET "http:{,,,}//www.google.com"

Centos 7 및 MacOS에서 테스트 완료.

루프가 올바른 방법일 가능성이 높지만, 여기 재미있는 대안이 있습니다.

echo -e {1..10}"\n" |xargs -n1 some_command

호출 파라미터로 반복번호가 필요한 경우 다음 명령을 사용합니다.

echo -e {1..10}"\n" |xargs -I@ echo now I am running iteration @

편집: 위에 제시된 솔루션은 단순한 명령어 실행(파이프 없음 등)만으로 원활하게 작동한다고 올바르게 설명되었습니다.언제든지 사용할 수 있습니다.sh -c더 복잡한 일을 할 수 있지만 그럴 가치가 없어요

일반적으로 사용하는 또 다른 방법은 다음과 같습니다.

rep() { s=$1;shift;e=$1;shift; for x in `seq $s $e`; do c=${@//@/$x};sh -c "$c"; done;}

다음과 같이 부를 수 있습니다.

rep 3 10 echo iteration @

처음 두 숫자는 범위를 나타냅니다.@반복번호로 변환됩니다.이제 파이프에도 사용할 수 있습니다.

rep 1 10 "ls R@/|wc -l"

디렉토리 R1 내의 파일 수를 알려드립니다.R10.

스크립트 파일

bash-3.2$ cat test.sh 
#!/bin/bash

echo "The argument is  arg: $1"

for ((n=0;n<$1;n++));
do
  echo "Hi"
done

및 아래 출력

bash-3.2$  ./test.sh 3
The argument is  arg: 3
Hi
Hi
Hi
bash-3.2$

조금 순진하긴 하지만 내가 보통 바로 기억하는 것은 이것이다.

for i in 1 2 3; do
  some commands
done

@joe-koberg의 답변과 매우 유사합니다.특히 당신이 많은 반복이 필요하다면, 나는 단지 다른 구문을 기억하기 어려울 뿐이다. 왜냐하면 나는 작년에 그것을 사용하지 않았기 때문이다.bash많이요. 적어도 대본 작성에는요.

의 대체 형식은 어떻습니까?for에 기재되어 있다(autref)루프 구성?

언급URL : https://stackoverflow.com/questions/3737740/is-there-a-better-way-to-run-a-command-n-times-in-bash

반응형