Executando um programa com vários parâmetros (loop)

2

Eu tenho um programa, prog , que usa um argumento inteiro quando eu o chamo do terminal, por exemplo:

./prog 10

Gostaria de executar prog com um intervalo de valores, por ex. %código%. Existe uma maneira legal de fazer isso, além de usar:

./prog 10 ; ./prog 20 ; ./prog 30 ; ....
    
por BillyJean 13.08.2013 / 10:02

3 respostas

5

Você pode usar um loop for simples com Bash, Zsh ou Ksh93. Os seguintes trabalhos somente desde Bash versão 4 (2009), zsh 4.3.10 (2010) e ksh93r (2006) (embora a sintaxe {x..y} tenha se originado em zsh (em 2.6-beta4 em 1995)).

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

A parte {$start..$end..$step} diz que $i está no início igual a $start e $i irá para $end . O $step é o valor com o qual $i será aumentado a cada etapa. Então, obtemos os valores 10 20 30 ... 100 para $i .

Você também pode escrever tudo em uma linha com

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

Se você tiver um Bash antigo e o% GNUseq estiver disponível, use as seguintes linhas

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

ou como um forro

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

(o acima assume que você não modificou a variável $IFS ).

    
por 13.08.2013 / 10:12
6

A questão é marcada com bash , isso é apenas para o benefício dos usuários de outros shells.

Em um script POSIX sh (para portabilidade):

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

Em um script Bourne sh (para compatibilidade com sistemas anteriores a 90):

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

Em zsh (para pessoas não restritas a usar bash ):

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

Ou

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

ou:

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

ou:

zargs -n1 {1..10}0 -- ./prog
    
por 13.08.2013 / 11:44
-1

Existem várias maneiras de fazer o printf fazer isso para você, mas aqui estão apenas algumas:

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

Ou talvez você queira que o programa seja executado 30 vezes. seq uence e printf são muito bem correspondidos para este fim:

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

Ou talvez os resultados do seu comando envolvam algum valor de variável que você não deseja sacrificar no lado mais distante de um canal. Ok.:

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

Possivelmente você não quer os números, mas quer tantas cópias de uma string, ou talvez apenas parte do comando precise ser repetida, mas outras partes são estáticas:

 . <<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'
    
por 31.03.2014 / 18:02