Expansão de Variável
Trata-se basicamente de uma capacidade de expansão de string que permite fazer referência a variáveis. , indexar arrays, substituição condicional de variáveis, conversão de caixa (maiúscula/minúscula), seleção de substring, identificação e substituição de expressões regulares, substituição de classe de caracter, padding strings, expansão repetida em loops controlados pelo usuário, suporte a expressões aritméticas no início do loop, condições de step e fim e expansão recursiva.
Ao usar caracteres de expansão variável em um registro de volume label format, o formato deve ser sempre delimitado com aspas duplas (“).
Por exemplo, ${HOME} será substituído pelo seu home directory, conforme definido no ambiente. Se você definiu a variável xxx para ser Test, então a referência ${xxx:p/7/Y/r} irá fazer o pad à direita do conteúdo de xxx para um tamanho de sete caracteres, preenchendo com o caractere Y. Isso retornará o resultado YYYTest.
Variáveis Bacula
No Bacula há três classes principais de variáveis com algumas pequenas variações entre elas, que são:
Contadores
Contadores são definidos pelos recursos do arquivo conf do Director. O contador pode ser tanto um contador temporário que dure o tempo da execução do Bacula ou pode ser uma variável gravada no catálogo e que retém o valor entre execuções do Bácula. Variáveis de contador podem ser incrementadas ao se colocar um sibnal de mais (+) após o nome da variável.
Variáveis Internas
Variáveis internas são somente leitura e podem ser relacionadas ao job atual (ex.: Job name) ou talvez variáveis especiais como data e hora. As variáveis a seguir estão disponiveis:
Year
– o ano inteiro
Month
– o mês atual de 1 a 12
Day
– o dia do mês de 1 a 31
Hour
– a hora de 0 a 24
Minute
– o minuto atual de 0 a 59
Second
– o segundo atual de 0 a 59
WeekDay
– o dia da semana atual de 0 a 6 (onde 0 é domingo)
Job
– o nome do job
general
– o nome do Director
Level
– o nível do Job
Type
– o tipo do Job
JobId
– o JobId
JobName
– o nome único composto pelo nome do job e data
Storage
– o nome do daemon do storage
Client
– o nome do client
NumVols
– o número atual de volumes no pool
Pool
– o nome do pool
Catalog
– o nome do catálogo
MediaType
– o tipo de mídia
Variáveis de Ambiente
Variáveis de ambiente são somente leitura e devem ser definidas no ambiente principal de execução d Bacula. Elas podem ser tanto escalares como em array, onde os elementos do array são referenciados ao se executar subscripts do nome da variável (${Months[3]}, por exemplo). Os arrays de variáveis de ambiente são definidos ao se separar os elementos com a barra verrtical (|), de forma que ao ajustar Months=”Jan|Feb|Mar|Apr|…” define-se uma variável de ambiente com o nome Month que será tratada como um array e que a referência ${Months[3]} irá considerar até Mar. Os elementos do array podem ter tamanhos diferentes.
Sintaxe Total
Uma vez que a sitaxe é bastante extensiva, abaixo será usado o pseudo BNF. Os caracteres especiais têm o seguinte significado:
::= definição
( ) agrupamento se os parênteses não estiverem entre aspas
| separa alternativas
‘/’ literal / (ou qualquer outro caracter)
CAPS um caracter ou uma sequência de caracteres
* o item precedente pode ser repetido nenhuma ou mais vezes
? o item procedente pode aparecer uma vez ou nenhuma
+ o item precedente deve aparecer uma ou mais vezes
E o pseudo BNF que descreve a sintaxe é:
input ::= ( TEXT
| variable
| INDEX_OPEN input INDEX_CLOSE (loop_limits)?
)*
variable ::= DELIM_INIT (name|expression)
name ::= (NAME_CHARS)+
expression ::= DELIM_OPEN
(name|variable)+
(INDEX_OPEN num_exp INDEX_CLOSE)?
(‘:’ command)*
DELIM_CLOSE
command ::= ‘-‘ (TEXT_EXP|variable)+
| ‘+’ (TEXT_EXP|variable)+
| ‘o’ NUMBER (‘-‘|’,’) (NUMBER)?
| ‘#’
| ‘*’ (TEXT_EXP|variable)+
| ‘s’ ‘/’ (TEXT_PATTERN)+
‘/’ (variable|TEXT_SUBST)*
‘/’ (‘m’|’g’|’i’|’t’)*
| ‘y’ ‘/’ (variable|TEXT_SUBST)+
‘/’ (variable|TEXT_SUBST)*
‘/’
| ‘p’ ‘/’ NUMBER
‘/’ (variable|TEXT_SUBST)*
‘/’ (‘r’|’l’|’c’)
| ‘%’ (name|variable)+
(‘(‘ (TEXT_ARGS)? ‘)’)?
| ‘l’
| ‘u’
num_exp ::= operand
| operand (‘+’|’-‘|’*’|’/’|’%’) num_exp
operand ::= (‘+’|’-‘)? NUMBER
| INDEX_MARK
| ‘(‘ num_exp ‘)’
| variable
loop_limits ::= DELIM_OPEN
(num_exp)? ‘,’ (num_exp)? (‘,’ (num_exp)?)?
DELIM_CLOSE
NUMBER ::= (‘0’|…|’9’)+
TEXT_PATTERN::= (^(‘/’))+
TEXT_SUBST ::= (^(DELIM_INIT|’/’))+
TEXT_ARGS ::= (^(DELIM_INIT|’)’))+
TEXT_EXP ::= (^(DELIM_INIT|DELIM_CLOSE|’:’|’+’))+
TEXT ::= (^(DELIM_INIT|INDEX_OPEN|INDEX_CLOSE))+
DELIM_INIT ::= ‘$’
DELIM_OPEN ::= ‘{‘
DELIM_CLOSE ::= ‘}’
INDEX_OPEN ::= ‘[‘
INDEX_CLOSE ::= ‘]’
INDEX_MARK ::= ‘#’
NAME_CHARS ::= ‘a’|…|’z’|’A’|…|’Z’|’0’|…|’9’
Semântica
Os itens listados no comando acima, que estão sempre depois de dois pontos (:), têm os seguintes significados:
– fazem uma substituição caso a variável esteja vazia
+ fazem uma substituição caso a variável não esteja vazia
o retira uma substring do valor da variável
# tamanho do valor da variável
* substitui string vazia se o valor da variável não está vazio
caso contrário substitui o parâmetro alternativo
s expressão regular de localização e substituição. As opções alternativas são:
m = multilinhas, i = case insensitive,
g = global, t = texto sem formatação (sem regexp)
y transpor caracteres da classe A para a classe B
p variável de pad para l = esquerda, r = direita or c = centro,
com segundo valor.
% chamada especial de função (nenhuma implentada)
l caixa baixa do valor da variável
u caixa alta do valor da variável
Os loop_limits são start, step e end.
Um nome de contador de variável seguido imediatamente por um mais (+) fará com que o contador seja incrementado por um.
Exemplos
Para criar uma data de arquivo ISO:
DLT-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}
em 20 de junho de 2003 retornaria DLT-2003-06-20
Ao ajustar a variável de ambiente mon para:
January|February|March|April|May|…
File-${mon[${Month}]}/${Day}/${Year}
no dia primeiro de março retornaria File-March/1/2003
Disponível em: Português