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.


Expansão de Parâmetros - Parte 3

Colaboração: Julio Cezar Neves

Data de Publicação: 28 de setembro de 2021

Expansões que trabalham com caixa de letras

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   # Todas as letras
cadeia
$ Var1=${Var1,}; echo $Var1    # Só a primeira letra
cADEIA

Invertendo a caixa (~)

$ Var1=${Var1~~}; echo $Var1   # Todas as letras
Cadeia
$ Var1=${Var1~}; echo $Var1    # Só a primeira letra
cadeia

Expansões para manipular textos

Para complementar texto (+)

$ Nome=Hedy; SNome=            # Nome tem dado e Snome não
$ echo O nome é $Nome ${SNome:+ e o sobrenome é $SNome}
O nome é Hedy
$ SNome=Coutinho               # Atribui valor a SNome
$ echo O nome é $Nome ${SNome:+ e o sobrenome é $SNome}
O nome é Hedy e o sobrenome é Coutinho

Para criar valor padrão (- ou =)

$ 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.

Ou seja, ao contrário da anterior, a expansão será realizada somente caso a variável sendo monitorada não tenha valor e isso é sensacional para se oferecer um valor que, caso confirmado com um <ENTER> receberá o padrão (default).

Fazendo o mesmo, porém usando uma Expansão de Parâmetros semelhante:

$ read -p "Login ($USER): " LN; : ${LN:=$USER}; echo $LN
Login (julio): 
julio

O comando : que foi usado não faz nada e por isso é muito rápido e como as Expansões de Parâmetros atuam como variáveis, elas sempre precisarão de um comando ou de uma atribuição para serem "executadas".

Informe de erro (?)

Parecido com o dois anteriores (- e =), pois atua somente nos casos em que o parâmetro é nulo ou não está declarado, quando então mandará uma mensagem para a saída.

Se o parâmetro estiver valorado, seu conteúdo será simplesmente expandido, caso contrário seu texto será o prefixo de uma mensagem de erro.

Veja esse teste:

$ cat tst.sh
read -p "Deseja continuar? " Responda
: ${Responda:?(S)im ou (N)ão}
sleep 3

Se como resposta for teclado <ENTER> sem informar nada, isto é, caso a variável $Responda permaneça vazia, a mensagem a seguir será exibida:

./tst.sh: linha 2: Responda: (S)im ou (N)ão

Após a execução desta expansão o programa abortará (e o sleep não será executado), o código de retorno ($?) não terá um valor zero (0), o que possibilita continuar a monitoração do programa.

Um uso interessante desta técnica é para uma monitoração prévia do ambiente do seu script. Suponha que ele necessite que alguma variável tenha sido exportada para ele (vou usar a $PATH como exemplo):

$ : ${PATH:?Impossível continuar,\
caminho dos arquivos não declarado}

Nos 4 últimos casos de Expansão de Parâmetros quando usamos dois pontos (:) - que não deve ser confundido com o comando : - a Expansão de Parâmetros será executada caso a variável não exista ou esteja vazia. Sem eles não haverá expansão caso a variável exista, mesmo que esteja vazia.

$ Var=  # Variável existe e está vazia
$ echo --${Var-Não vazia}--
----
$ echo --${Var:-Não vazia}--
--Não vazia--

Amanhã falaremos de algumas Expansões de Parâmetros que substituem o sed, o tr, o awk, o cut, o expr, o basename, o dirname, ...



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