Por que a função de repetição parece não funcionar?

-1
#function repeat   
repeat()  
{  
shift  
let b="$@"  
for i in {1..b} ; do echo Date starting 'date' ; echo Before waiting 'date'; sleep 6 ; echo Done waiting 'date' ; "$@" ; done  
}  

A primeira vez que tentei usar esta função, funcionou soberbamente; depois, nos últimos dias, funcionou duas vezes e depois funcionou apenas uma vez

$ repeat 7 ls

a saída usada para mostrar 7 vezes mais cedo, depois mostrou apenas duas vezes, agora mostrando a saída apenas uma vez.
Por favor, deixe-me saber qual erro existe no script que nunca foi alterado desde o primeiro dia.

    
por devilz 04.12.2016 / 07:52

1 resposta

1

Você não especificou qual shell é o script pretendido. Eu vou assumir que é Bash.

Sua função repeat é definida como (copiada aqui do seu post):

repeat()
{
shift
let b="$@"
for i in {1..b} ; do echo Date starting date ; echo Before waiting date; sleep 6 ; echo Done waiting date ; "$@" ; done
}

Você está chamando-o com repeat 7 ls . Então $1 é 7 e $2 é ls . A função é executada:

shift

Isso elimina $1 , $1 se torna ls , $2 não está definido e $# é 1.

let b="$@"

b está definido como ls .

for i in {1..b} ; do

O loop será executado uma vez com i definido como {1..b} . (Parece que você queria tentar gerar alguns números usando a expansão de chaves; talvez {1..6} pareça muito semelhante?)

echo Date starting date
echo Before waiting date
sleep 6
echo Done waiting date ;

Exiba Date starting date , Before waiting date , aguarde 6 segundos e finalmente exiba Done waiting date . Talvez você quisesse 'date' ?

"$@"

$1 é ls e $# é 1; isso executa ls .

done

Fim do ciclo for .

Em geral, a função exibirá uma mensagem, aguardará 6 segundos, exibirá outra mensagem e executará um comando cujo nome é $2 , possivelmente transmitindo $3 , ... como argumentos para o comando. $1 não é usado.

(Eu não vou comentar sobre a afirmação de que no passado essa função costumava fazer outra coisa.)

Uma definição de função de trabalho seria:

repeat()
{
  local n i
  n="$1"
  shift
  for ((i = 1; i <= "$n"; ++i)); do
    echo
    "$@"
  done
}

Por exemplo:

$ repeat 3 ls -F

Calibre/  Documents/  Music/     Public/  Temp/       Videos/
Desktop/  Downloads/  Pictures/  System/  Templates/  examples.desktop

Calibre/  Documents/  Music/     Public/  Temp/       Videos/
Desktop/  Downloads/  Pictures/  System/  Templates/  examples.desktop

Calibre/  Documents/  Music/     Public/  Temp/       Videos/
Desktop/  Downloads/  Pictures/  System/  Templates/  examples.desktop

Para uso em produção, algumas verificações de erros podem ter que ser adicionadas (há pelo menos dois argumentos, o primeiro argumento é um número, etc.).

    
por AlexP 04.12.2016 / 08:30