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