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/true
번 for
★★★★★★★★★★★★★★★★★」while
수줍음을 타다가 있는 , 이 수 .루프를 반복할 때마다 여러 명령어를 실행할 필요가 있는 경우에는 패스보다 고속으로 동작합니다.sh -c 'command1; command2; ...'
xargs로
그-P1
예를 들어, "로 바꿀 수 있다"고 말했다.-P8
8개의 프로세스를 동시에 생성하여 속도를 크게 향상시킵니다.
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
'programing' 카테고리의 다른 글
디렉토리의 파일을 루프 오버하고 경로를 변경하고 파일 이름에 접미사를 추가하는 방법 (0) | 2023.04.17 |
---|---|
Xcode 4는 "Attaching to (app name)"에 행업합니다. (0) | 2023.04.17 |
5행부터 시작하여 헤더를 포함한 python 데이터 프레임에 대한 읽기 성능 향상 (0) | 2023.04.17 |
CSV 파일에 큰따옴표 구분 기호 추가 (0) | 2023.04.17 |
MVVM Light RelayCommand 파라미터 (0) | 2023.04.17 |