Problemas na compreensão de como o conjunto funciona

0

Alguém por favor pode me ajudar a entender o seguinte segmento de código?

set -- ${BACKUPDIR}/backup-???.tgz
lastname=${!#}
backupnr=${lastname##*backup-}
backupnr=${backupnr%%.*}
backupnr=${backupnr//\?/0}
backupnr=$[10#${backupnr}]

Eu encontrei neste script de backup link onde é usado para obter o número do nome do arquivo do último backup armazenado. Os nomes de arquivos dos backups são "backup-ccc.tgz", em que ccc é um número de três dígitos que é incrementado toda vez que um novo backup é criado.

Eu entendo as linhas três e quatro, elas cortam o resto do nome do arquivo, então apenas a parte necessária com o número é deixada. O que eu não entendo é como as duas primeiras linhas estão funcionando. Eu li a manpage do set, mas agora estou mais confusa do que antes. O que o comando set -- filename faz? Também o que exatamente é a opção $ {! #} Para, que está sendo armazenada em lastname. Eu acho que $ {} é para desreferenciar um dado parâmetro, mas qual parâmetro faz a opção! # Apontar para?

Em segundo lugar eu não entendo porque eu preciso do comando na linha 5. Pelo que entendi isso é usado para substituir todos os pontos de interrogação com um 0 que são armazenados na variável backupnr, mas por que isso é feito? Se não houve um erro nos comandos antes de backupnr deve ser um número de três dígitos, se houve um erro e o conteúdo da variável está corrompido, você não pode saber qual é o valor real de backupnr. Então, se eu quiser verificar se há corrupção, por que não tenho que procurar por tudo isso, não um número, mas apenas um ponto de interrogação? Isso está de alguma forma relacionado ao que está acontecendo nas duas primeiras linhas?

    
por Asco 15.06.2016 / 20:19

1 resposta

1

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 :

% bl0ck_qu0te%

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.

    
por muru 15.06.2016 / 20:40