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