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!!!!