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.
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.
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 |
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"
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários (1)
Mistura diabólica: Julio Neves + Expansão de Parâmetros... O Julio sempre chega aonde ninguém chegou...