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.).