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.