Documentação da Libtrilux
ou libtrilux-devel.sh
Uma biblioteca de apoio genérico para os meus shell scripts, fazendo uso dos recursos
do Bash 5.x e minimizando as chamadas a comandos externos ou utilitários. Iniciada em
6.4.2025.
Neste momento estão disponíveis nela funções de tratamento de arrays e tokens, strings,
tags, controle de execução, interface com o usuário, tratamento de opções da linha de
comando, ajuda ao usuário, automação de testes, e mais. Seu escopo ainda está em
ampliação.
Para inclui-la em scripts, use 'source libtrilux.sh' ou, caso ela seja uma dependência
necessária, inclua-a com o comando composto abaixo:
. libtrilux.sh || { echo "Erro: não encontrei libtrilux.sh"; exit 8; }
Caso você a execute diretamente (sem ser pela inclusão em outro script), estão disponíveis
as opções a seguir:
-c exibe o teste de cores e formatações.
-e exibe os tipos de echos e mensagens.
-f lista a ajuda de todas as funções definidas na biblioteca.
-h exibe esta mensagem de ajuda.
--export-usage exporta a mensagem de ajuda para uso em geração de documentação.
CASO ESPECIAL: Se for chamada diretamente com o nome de libtrilux-devel.sh e sem
parâmetros, roda o teste local (função 'tl::test'), para apoio ao desenvolvimento da
própria biblioteca.
Documentação adicional (incl. FAQ) disponível em https://lib.trilux.org/.
Copyright (c) 2025, Augusto Campos (https://augustocampos.net/).
Licensed under the Apache License, Version 2.0.
FUNÇÕES DE ARRAYS E TOKENS
pack sep array
unpack sep string
Exemplo de uso com 'readarray':
tokenize string
Exemplo de uso com 'readarray':
token n string
Os tokens são numerados a partir de 1.
MANIPULAÇÃO DE STRINGS
leftstr n string
rightstr n string
substr n largura string
A contagem de posições começa de 1, e não de 0.
width string
tolower string
toupper string
strpos palheiro agulha
Caso não esteja presente, retorna 0 (e um erro em RC).
strcontains palheiro agulha
ltrim str
rtrim str
trim str
tags nome_do_array string
As tags na $string usam o formato %%nome_da_tag%% - e são substituídas por ${nome_do_array[nome_da_tag]}, se esse elemento existir no array (ou silenciosamente mantidas no lugar, caso o elemento no array não exista). Os nomes de tag levam em conta maiúsculas e minúsculas.
Exemplo:
centerstr largura str
Caso $str seja MAIOR do que a $largura, a string será cortada para caber no campo.
MATEMÁTICA E NÚMEROS
abs numero
rand5
EXPRESSÕES CONDICIONAIS
first arg1 arg2 ... argN
Exemplo:
is_true cond [str_verdadeiro] [str_falso]
Se for, imprime $str_verdadeiro (se estiver presente) e retorna 0 em RC; se não for, imprime $str_falso (se estiver presente) e retorna 1 em RC.
Ignora maiúsculas, e aceita como valores verdadeiros: yes|y|sim|s|v|1|true|on
is_set var_name
Exemplo:
is_equal a b
Exemplo:
in_array val array
Exemplo:
is_number arg
Além dos dígitos, aceita um sinal de menos à esquerda, e um ponto decimal.
NOMES DE ARQUIVOS E EXTENSÕES
extfile file_path
filenoext file_path
shortpath file_path
O path retornado por essa função é absoluto, ou seja, referenciado com base no diretório raiz do sistema.
homepath file_path
normaliza_nome str
Substitui caracteres acentuados dos idiomas latinos por suas versões sem acento, substitui espaços e underscores por hífens, e em seguida remove todos os caracteres que não sejam alfabéticos, numéricos, hífen ou ponto.
Nota: usar o comando 'iconv -f utf8 -t ascii//TRANSLIT' dá resultados mais completos, porém é mais um caso em que os sistemas da Apple vêm com uma versão desatualizada do utilitário, que impede esse uso (ou demandaria adaptação). A substituição pelas rotinas da shell, usada nesta função, é compatível em todos os sistemas que usem o Bash 5+.
CODIFICAÇÃO PARA URLS
urlencode string
urldecode string
COMPATIBILIDADE ENTRE MACOS, BSD E GNU
algum_comando | mytac
sysdate_getepoch [-l] "YYYY-MM-DD HH:MM:SS"
DATA E HORA
dt_now
dt_iso [-u] [unix_time]
Será a hora atual, a menos que outro horário (no formato Unix - segundos desde 1970) seja passado como o parâmetro $unix_time.
dt_ts [unix_time]
Será a hora atual, a menos que outro horário (no formato Unix - segundos desde 1970) seja passado como o parâmetro $unix_time.
dt_human [-d|-h] [unix_time]
Será a hora atual, a menos que outro horário (no formato Unix - segundos desde 1970) seja passado como o parâmetro $unix_time.
dt_tounix [-l] str_data
A $str_data deve ter exatamente essa sequência de números: "ano mês dia hora minutos segundos".
Todos os zeros à esquerda são descartados. Também será descartada qualquer coisa que vier depois dos segundos (incluindo frações e eventual menção a um fuso horário, se presente).
Os separadores podem ser quaisquer combinações de letras, espaços, tabs e pontuação.
Assume que a hora é local, a menos que a flag -l esteja presente:
dt_add unix_time delta [unidade]
O valor de $delta será considerado em segundos, a não ser que uma $unidade tenha sido definida (s, m, h, d: para segundos, minutos, horas ou dias).
Para subtrair, passe $delta como um número negativo.
dt_fuzzydiff unix_time1 unix_time2
Importante: a diferença é analisada desprezando o sinal, ou seja, o resultado será idêntico para resultados positivos ou negativos.
TERMINAL E TUI
xecho [-B|-A] [-C] [-tsrwcevidf] str
A mensagem em $str pode conter os códigos de formatação e cor (v. 'ansifmt')
As opções -B e -A adicionam uma linha em branco antes e depois da mensagem.
A opção -C centraliza a $str na linha do terminal (apenas nas formatações que usam a linha inteira, como -t, -s, -r e -c).
Dica: chame a biblioteca diretamente, com o parâmetro '-e', para ver a lista e exemplos dos tipos de mensagens disponíveis.
Tipos de formatação:
xechomode [+qdDv|-qdDv]...[+qdDv|-qdDv]
Sim, dá para ativar simultaneamente 'quiet' e 'verbose' - eles lidam com mensagens diferentes.
Default: ao carregar a biblioteca, o modo 'verbose' é ativado por default, e os demais são desativados.
Importante: para mudar vários modos com um mesmo comando, passe-os na forma "+d +q -v", não agrupados (i. e. não os passe na forma "+dq -v").
msg banner msg | msg -d details
Os banners “ok”, “test”, “fail” e “error” são identificados com cores especiais.
echovar var
ansifmt string
Os 'códigos' podem ser qualquer índice dos arrays tl_ansicode (como 'bold' ou 'rev') ou tl_colornames (como 'red' ou 'cyan'). Um nome de cor pode ser prefixado com um 'b' para indicar uma cor de fundo. Cada código é substituído pela sequência ANSI correspondente, definida em tl::setlibvars() (que é chamada automaticamente na inicialização da biblioteca).
Códigos extras: b/B (bold/unbold), r/R (rev/unrev), C (uncolor), x (reset)
Dica: chame a biblioteca diretamente, com o parâmetro '-c', para ver a lista e exemplos das cores e formatações disponíveis.
Exemplo:
Nota: se a saída padrão não for um terminal (por exemplo, se for uma pipe ou um arquivo de saída, os códigos de formatação gerados na inicialização desta biblioteca estarão vazios, e esta função apenas removerá as marcações de formato, sem incluir formatação em seu lugar.
termwidth [default]
etitle str
esubtitle str
erevline str
ecritical str
ewarning str
eerror str
everbose str
einfo str
enormal str
edebug str
lt::edebuglib str
efixline str
Antes de chamar, é recomendável testar (no seu script) se a saída padrão está conectada a um terminal, pois não faz sentido chamar esta função se o programa estiver conectado a uma pipe ou a um arquivo de saída, por exemplo. Uma forma de testar se a saída padrão é um terminal é:
if [ -t 1 ] ; then echo "é um terminal"; else echo "não é um terminal"; fi
OPÇÕES DA LINHA DE COMANDO
mygetopts valid_opts return_array "$@"
O primeiro parâmetro define as opções válidas (no mesmo formato do 'getopts') e o segundo é o nome do array associativo ao qual serão adicionadas as opções selecionadas na linha de comando (no contexto do chamador).
O terceiro parâmetro será sempre "$@" (incluindo as aspas), a não ser que você esteja processando algo que não sejam os parâmetros da linha de comando.
O mygetopts suporta opções curtas (tipo '-v' ou '-o teste.txt') e longas (tipo '--help' ou '--outfile=teste.txt'), com ou sem os argumentos extras mostrados nestes exemplos (para ativar argumentos extras em opções curtas, use um : logo após o nome da opção em $valid_opts, ou veja a documentação do getopts).
Para ativar as opções longas, inclua "-:" no valor de $valid_opts.
O exemplo acima (usando o 'eval') chama o 'getopts' do sistema com os parâmetros "hvd-:" ativados, permitindo as opções -h, -v, -d e qualquer opção longa. Os resultados, apenas para as opções que estiverem presentes na linha de comando, serão armazenados em variáveis como: ${return_array[h]}, ${return_array[d]}, ${return_array[outfile]}, etc.
NOTAS SOBRE O MYGETOPTS:
1. APENAS parâmetros presentes na linha de comando são criados no array.
2. Os parâmetros são criados como índices no array, e seus argumentos extras (quando há) são armazenados como os valores correspondentes.
3. Quando não há argumento extra, o parâmetro é armazenado como índice e valor.
4. É possível usar o 'is_set' para facilitar o tratamento das opções, como neste exemplo real a seguir, extraído do utilitário test_libtrilux.sh e que lida com opções de help e modos verbose e quiet:
5. Nos bastidores, esta função retorna uma sequência de comandos da shell, pronta para ser executada pela shell (por isso o uso do 'eval'), declarando o array associativo, definindo seus valores e fazendo o 'shift' das opções e parâmetros que tiverem sido consumidos, deixando o restante da linha de comando original disponível para uso pelo chamador.
6. Assim, como o 'eval' roda no contexto do chamador, nós evitamos as complexidades de passar e receber arrays associativos como parâmetros, e fazer o 'shift', considerando os contextos do chamador e da função que é chamada. O outro lado da moeda é que o 'eval' tratando parâmetros trazidos pelo usuário introduz potenciais riscos de segurança, portanto você não deveria usar esta função em rotinas que demandem segurança superior (i. e. que não possam confiar nesta biblioteca ou no usuário que passará os parâmetros).
AJUDA AO USUÁRIO
usage [msg]
Para definir a variável $USAGE no seu script, você pode usar um modelo como este:
As seguintes tags HTML (de abertura e de fechamento) podem ser usadas: b, i, tt.
Todos os elementos de formatação visual desta biblioteca (v. 'ansifmt') podem ser utilizados.
DICA: para definir opções de linha de comando em seu script, consulte o 'mygetopts', neste guia.
CONTROLE DE FLUXO
require [-m exit_msg] --type arg1... argn
repeatcmd n cmd [params]
retrycmd [-m max] [-p segundos] cmd [params]
Defaults: 3 tentativas, 2 segundos
APOIO A TESTES
mytest [-e] [-o "OUTPUT"] func [params]
Os modos verbose e quiet (ver 'xechomode') influenciam no detalhamento exibido por esta função.
Dependendo do resultado do teste, incrementa as variáveis globals $TL_MYTEST_SUCCESS ou $TL_MYTEST_FAILURE.