você está aqui: Home  → Arquivo de Mensagens Programação Shell Linux: Inscrições Abertas

bash - Expansão de Parâmetros

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



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