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: 06 de abril de 2020
Com o comando set
podemos passar parâmetros, então vamos fazer, direto
no prompt, o seguinte:
$ set {a..k} $ echo $@ a b c d e f g h i j k $ echo $0 bash
Isto é, passamos para o Bash parâmetros da letra a
até a letra k
. Agora veja:
$ echo $1 - $6 - $11
a - f - a1
E foi aí que a vaca foi pro brejo? O $11
é visto como o $1
concatenado com 1
.
A partir do bash 2.0 começou-se a usar a Expansão de Parâmetros para resolver esse problema. Uma Expansão de Parâmetros tem a seguinte forma: ${EXP_PARM}
. Então a primeira a ser criada foi para resolver esse problema. E a forma certa para listar essa variável ficou sendo:
$ echo ${11}
k
A partir daí então começaram a desenvolver uma série de Expansões de Parâmetros que atuam somente sobre variáveis - e por isso, no interior de uma Expansão de Parâmetros, os nomes das variáveis sobre as quais está atuando não precisam ser precedidos por um cifrão ($
) - e têm por princípio serem extremamente rápidas e aceitarem metacaracteres de expansão de arquivos (*
, ?
e [ ... ]
)na composição do seu escopo. Nesse artigo vou citar as principais, dando exemplos.
Vamos fazer:
$ Var1=cadeia
Passando para caixa alta:
$ Var1=${Var1^}; echo $Var1 # Só a primeira letra Cadeia $ Var1=${Var1^^}; echo $Var1 # Todas as letras CADEIA
Passando para caixa baixa:
$ Var1=${Var1,}; echo $Var1 # Só a primeira letra cADEIA $ Var1=${Var1,,}; echo $Var1 # Todas as letras cadeia
Para complementar texto:
$ unset Var2 # Matei Var2 $ echo Var1 tem $Var1 ${Var2:+ e Var2 tem $Var2} Var1 tem cadeia $ Var2=STRING # Atribui valor a Var2 $ echo Var1 tem $Var1 ${Var2:+ e Var2 tem $Var2} Var1 tem cadeia e Var2 tem STRING
Para criar valor padrão:
$ read -p "Login ($USER): " LN; LN=${LN:-$USER}; echo $LN Login (julio): julio $ read -p "Login ($USER): " LN; LN=${LN:-$USER}; echo $LN Login (julio): Botelho Botelho
No exemplo acima ofereci a variável de sistema $USER
como valor default
(entre parênteses). Na primeira execução dei <ENTER>
para aceitar este valor
e como você pode ver, a Expansão de Parâmetros botou na variável $LN
, que
estava vazia o valor de $USER
.
Então essa Expansão de Parâmetros faz o seguinte: se a primeira variável
(no caso $LN
) estiver vazia, ela recebe o valor da segunda ($USER
). Caso
contrário permanece com seu valor original.
Para pegar o tamanho de uma variável:
$ echo ${#Var1}
6
Para cortar cadeias:
Para cortar $Var1
da posição 2 (origem zero) com 3 caracteres, faça:
$ echo ${Var1:2:3} dei $ echo ${Var1:2} # Da posição 2 até o fim deia $ echo ${Var1:2: -1} # Da posição 2 até uma posição antes do fim dei $ echo ${Var1: -4} # Da 4a posição antes do fim até o fim deia $ echo ${Var1: -4: -1} # Da 4a posição antes do fim até uma antes dei
Para substituir cadeias:
$ echo ${Var1/d/n} # Troca 1o. d por n caneia $ echo ${Var1//a/u} # Troca todos a por u cudeiu $ echo ${Var1/d*/veira} # Metacaractere. A partir do d caveira
Para renomear todos arquivos com espaços no nome:
for Arq in *' '* do mv "$Arq" ${Arq// /_} done
Apagando à esquerda:
$ Data=15/08/2019 $ echo ${Data#*/} # Apaga à esquerda tudo até a 1a / 08/2019 $ echo ${Data##*/} # Apaga à esquerda tudo até a última / 2019
Apagando à direita:
$ echo ${Data%/*} # Apaga à direita tudo após a última barra 15/08 $ echo ${Data%%/*} # Apaga à direita tudo após a 1a. barra 15
Mostrei para você somente algumas Expansões de Parâmetros, mas existem inúmeras outras que são menos usadas como é o caso da indireção, veja só. Lá no início eu passei 11 parâmetros para o Bash (de a
até k
). Como faço para listar o último deles sem saber quantos foram passados?
Solução sem Expansão de Parâmetros:
shift $(($# - 1)) echo $1
Como $#
tem a quantidade de parâmetros passados eu subtraí 1 fazendo um shift 10
que joga fora os 10 primeiros. Depois foi só listar o único que sobrou.
Solução com Expansão de Parâmetros
echo ${!#}
que lista o valor da variável apontada por $#
, isto é $11
.
Copie essas linhas para um script e experimente passar uma quantidade variada de parâmetros para ele, inclusive colocando espaços dentro de um ou mais parâmetros.
Como você pode ver, as Expansões de Parâmetros podem substituir o cut
, o sed
, o expr
, o tr
, o test
e outros comandos externos, que são pesados, lentos e complexos. Espero que este artigo lhe seja útil e que você passe a usar estes builtins, para acabarmos com esta lenda que o Shell é lento.
SuShellso!!!!
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)
Muito bom!