De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

Expansão de Parâmetros de Transformação

Colaboração: Julio Cezar Neves

Data de Publicação: 11 de agosto de 2024

Sou fã ardoroso de Expansão de Parâmetros, pois em linguagens interpretadas, nada é tão veloz, tão performático quanto as Expansões de Parâmetros.

Justamente por eu me dedicar muito ao Shell venho sempre estudando e tentando me manter atualizado, sempre dedicando uma atenção especial às Expansões de Parâmetros.

Por que estou fazendo esta introdução? Por que estou falando isso? Foi porque há muito pouco tempo, li um artigo do Chet Ramey, principal mantenedor do Bash que falava sobre as "Expansões de Parâmetros de Transformação". Depois de muito garimpar na internet, fui aos poucos descobrindo o material que relato neste artigo e que julgo ser a primeira documentação deste tema escrito em pt_BR.

Expansão de Parâmetros de Transformação: ${PARM@OPER}

Ela não é muito usada, mas para esse tópico ser completo, não poderia deixar de citá-la, ela usa "Operadores de Transformação", onde OPER pode ser um dos seguintes:

OPER Transformação produzida
U Passa VAR para maiúsculas
u Primeiro caractere de VAR em maiúscula
L Passa VAR para minúsculas
Q Expande VAR para um formato que pode ser reutilizado como entrada
E Expande os caracteres "escapados" (escape sequences)
P Expande os caracteres de formatação de prompt de VAR (Veja seção "PS1 e PS2" ou o artigo Controlling the Prompt)
A Retorna uma cadeia que pode ser usada para atribuir uma variável com seu nome, valor e opções de declaração existentes, se houver.
a Retorna uma cadeia listando os atributos da variável.
K Produz uma versão possivelmente entre aspas do valor do parâmetro, exceto que imprime os valores de matrizes indexadas e associativas como uma sequência de pares chave-valor entre aspas

Exemplos das transformações:

Transformadores @u, @U e @L

$ Var=alfa
$ echo ${Var@u}              # Primeira letra maiúscula
Alfa
$ Var=${Var@U}; echo $Var    # Tudo em maiúsculo
ALFA
$ Var=${Var@L}; echo $Var    # Tudo em minúsculo. ${Var@l} dá erro
alfa

Transformador @Q

Como listar um arquivo multilinha em uma única linha para poder listá-la com um simples echo? Simples...

$ Linha="$(<arq)"            # O mesmo que Linha=$(cat arq)
$ echo ${Linha@Q}
$'Um\nDois\nTrês'
$ echo "$Linha"
Um
Dois
Três

Transformador @E

$ OutraLinha="Um\nDois\n\tTrês"
$ echo "${OutraLinha@E}"     # Tem que escapar com aspas/apóstrofos
Um
Dois
	Três

$ Var="Dia \d às \t horas"   # No prompt \d=data \t=hora
$ echo ${Var@P}
Dia sex jan 20 às 11:17:12 horas

Transformador @A

$ declare -l B=bola
$ declare -u C="Chuta a $B"
$ echo ${C@A}
declare -u C='CHUTA A BOLA'

Transformador @a

Dando um:

$ help declare

Descobrimos que os atributos válidos são: a A i l n t u x.

Então vamos fazer um loop com cada um desses atributos e verificar a validade do operador @a.

$ for Opt in a A i l n t u x; do
>     unset Var
>     declare -$Opt Var
>     echo $Opt -- ${Var@a}
> done
a -- a
A -- A
i -- i
l -- l
n --
t -- t
u -- u
x -- x

Como no declare -n Pont=Var, o ponteiro Pont aponta para a variável Var, fazer ${Pont@a} só teria sentido se Var estivesse definida, pois neste caso seria listado o tipo de Var. E foi por isso o atributo n ficou vazio

Transformador @K

A partir do Bash 5.1 passou a ser permitida a declaração de vetores (arrays) associativo usando apenas o par índice-valor e também a partir desta versão surgiu o transformador @K, justamente para listar esses pares.

Nas versões anteriores fazíamos:

$ Animais=([cavalo]=doméstico [zebra]=selvagem
     [gato]=doméstico [tigre]=selvagem)

As mesmas atribuições do exemplo acima, a partir da versão 5.1 do Bash, poderiam ser feitas da seguinte maneira:

$ Animais=(cavalo doméstico zebra selvagem
     gato doméstico tigre selvagem)

E esses pares índice-valor podem ser listados da seguinte forma:

$ echo ${Animais[@]@K}
cavalo "doméstico" tigre "selvagem" zebra "selvagem" gato "doméstico"

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários (1)

Avatar
Novo

Mistura diabólica: Julio Neves + Expansão de Parâmetros... O Julio sempre chega aonde ninguém chegou...

(Editado)


Veja a relação completa dos artigos de Julio Cezar Neves