substituição de variável no CLI e para loops

2

Tenho certeza de que isso já foi feito de alguma forma, mas não consigo encontrar uma boa descoberta para pesquisá-lo.

Eu quero ter um script que faça as coisas N vezes e para o qual eu possa passar como variável o comando para emitir N vezes. Em geral, o comando pode usar o valor do iterador para alterar alguma coisa. Por exemplo, eu gostaria de fazer algo como

~> doNtimes.sh 10 0 "ls *$(($2 + $i ))*.gnu | wc -l;"

onde doNtime.sh é algo como

  for ((i=0; i < $1; ++i)); do 
       echo "iterator=$i"; 
       $3
  done

é claro que o uso atual de aspas duplas me faz falhar. Eu tentei com aspas simples, mas não funciona também (embora por um motivo diferente). O fato de eu ter variáveis com espaços e conter variáveis para serem avaliadas no script me impossibilita de encontrar a sintaxe correta ... alguma idéia?

    
por Rho Phi 15.01.2015 / 18:35

2 respostas

1

Você precisa de eval:

for ((i=0; i < $1; ++i)); do 
    echo "iterator=$i"; 
    # for debugging
    echo eval "$3"
    eval "$3"
done

É claro que você deve prestar atenção à citação correta na string de comando. Seu exemplo ls *$(($2 + $i ))*.gnu | wc -l é perigoso nesse sentido porque as referências de variáveis são resolvidas em "" , ou seja, antes de o script ser executado. Você precisa de aspas simples:

doNtimes.sh 10 0 'ls *$(($2 + $i ))*.gnu | wc -l'
    
por 15.01.2015 / 18:41
0
yes _do | head -n 10 | 3<&0 0>&- \
<<\INIT sh -s -- my args
    alias _do='echo these are "$@."'
    exec <&3 3>&- 
#END
INIT

Você também pode forçar o avanço de uma casca com facilidade. xargs também funcionaria.

OUTPUT:

these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
    
por 16.01.2015 / 02:20