다양한 매개변수를 사용하여 프로그램(루프)을 실행합니다.

다양한 매개변수를 사용하여 프로그램(루프)을 실행합니다.

prog터미널에서 호출할 때 다음과 같은 정수 인수를 받아들이는 프로그램이 있습니다 .

./prog 10

prog다음과 같은 값 범위를 사용하여 이 작업을 수행 하고 싶습니다 10, 20, 30, .... 다음을 사용하는 대신 깔끔한 방법이 있습니다.

./prog 10 ; ./prog 20 ; ./prog 30 ; ....

답변1

Bash, Zsh 또는 Ksh93에서 간단한 for 루프를 사용할 수 있습니다. 다음은 Bash 버전 4(2009), zsh 4.3.10(2010) 및 ksh93r(2006)에만 적용됩니다(구문은 ( 1995) {x..y}에서 시작되었지만 ).zsh2.6-beta4

#!/bin/bash
# since Bash v4
for i in {10..100..10}
do
     $path_of_prog/prog $i
done

{$start..$end..$step}부분은 $i시작이 같음을 의미하며 로 이동 $start합니다 . 각 단계에서 추가되는 금액입니다 . 이런 식으로 우리는 의 값을 얻습니다.$i$end$step$i10 20 30 ... 100$i

한 줄에 모두 쓸 수도 있습니다

for i in {10..100..10}; do ./prog $i; done

이전 Bash가 있고 seqGNU를 사용할 수 있는 경우 다음 줄을 사용하십시오.

#!/bin/bash
#only for pre Bash v4
for i in $(seq 10 10 100)
do
   $path_of_prog/prog $i
done

아니면 단일 안감으로

for i in $(seq 10 10 100);do ./prog $i; done

$IFS(위에서는 변수를 수정하지 않았다고 가정합니다 .)

답변2

질문은 다음과 같이 표시되어 있습니다 bash. 이는 다른 쉘 사용자를 위한 것입니다.

POSIX sh 스크립트에서(이식성을 위해):

i=10
while [ "$i" -le 100 ]; do
  ./prog "$i"
  i=$(($i+10))
done

Bourne sh 스크립트에서(90년대 이전 시스템과의 호환성을 위해):

echo '0[10+pd100>x]dsxx' | dc | xargs -n 1 ./prog

zsh(사용이 제한되지 않은 경우 ) bash:

i=0; repeat 10 ./prog $((i+=10))

또는

for i ({1..10}0) ./prog $i

또는:

for ((i=10;i<=100;i+=10)) ./prog $i

또는:

zargs -n1 {1..10}0 -- ./prog

답변3

printf가 이 작업을 수행하도록 하는 방법에는 여러 가지가 있지만 다음은 몇 가지 예입니다.

printf ' ./prog %d0\n' 1 2 3 | sh

아니면 프로그램이 실제로 30번 실행되기를 원할 수도 있습니다.seq영향그리고printf이 목적에 완벽합니다:

printf ' ./prog %d\n'  `seq 1 30` | sh

또는 명령 결과에 파이프 끝에서 희생하고 싶지 않은 일부 변수 값이 포함될 수도 있습니다. 좋아요 :

. <<CMD /dev/fd/0
    $(printf './prog %d0\n' 1 2 3 )
CMD

숫자는 필요하지 않지만 문자열의 여러 복사본이 필요할 수도 있고, 명령의 일부만 반복해야 하지만 다른 부분은 정적일 수도 있습니다.

 . <<CMD /dev/fd/0
    $( { printf 'echo "this is part 1" >&2| ' ;\
    printf 'echo "these are parts %d" >&2 | ' `seq 1 5` ; })
CMD

printf 'this string is repeated for each of printfs args, 
    but the args are not included%.0b\n' `seq 1 5`

관련 정보