set é frequentemente usado para definir os parâmetros posicionais ( $1 , $2 , $3 , etc., que geralmente são fornecidos como argumentos para o script). Usando esses parâmetros, podemos obter uma maneira simples de contar as coisas por meio da variável $# , que armazena o número de parâmetros posicionais definidos.
? é um caractere curinga que corresponde a qualquer caractere único, por isso ??? corresponde a qualquer combinação de três caracteres.
Combinado: set -- ${BACKUPDIR}/backup-???.tgz define cada arquivo chamado backup-xxx.tgz , em que xxx tem três caracteres, como os parâmetros.
${!#} , usa indireto de variável :
Como $# , que é o que você obtém quando remove o ! , é a contagem de parâmetros (e o número do último parâmetro), ${!#} é uma maneira simples de obter o último argumento. / p>
Quanto ao comando 5, o que acontece quando não há arquivos correspondentes?
$ bash -c 'set -- backup-???.tgz; echo "$@"'
backup-???.tgz
O shell deixa essa palavra sozinha, então agora temos apenas um literal backup-???.tgz . O autor manipula esse caso de borda substituindo o ? por 0 , para marcar o primeiro arquivo de backup.