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}
에서 시작되었지만 ).zsh
2.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
$i
10 20 30 ... 100
$i
한 줄에 모두 쓸 수도 있습니다
for i in {10..100..10}; do ./prog $i; done
이전 Bash가 있고 seq
GNU를 사용할 수 있는 경우 다음 줄을 사용하십시오.
#!/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`