Eu trabalho com Linux há 16 anos e por volta de 12 anos com programação shell script e, no meio desse tempo eu conheci sobre expansão de parâmetro com variáveis no bash e isso mudou muito a forma que eu programava. Ficou muito mais fácil, rápido e divertido produzir códigos utilizando bash.

Ao final deste artigo você saberá:

  • O que é expansão de parâmetro com variáveis;
  • Como utilizar este recurso no terminal do Linux e em scripts;
  • Como resolver o desafio utilizando apenas substring;

Se você ainda não leu meu último artigo/tutorial sobre “como programar no console do linux”, recomendo que leia antes de continuar lendo este artigo. Digo isso porque são conteúdos complementares e que podem te ajudar a entender sobre este assunto.
Se você é um usuário avançado e já conhece o básico sobre programação shell, talvez o conteúdo à frente seja mais suave de entender.

A expansão de parâmetro em varáveis do bash é um recurso que basicamente manipula e transforma o valor de uma variável sem precisar utilizar outros programas e utilitários externos. É bastante útil em programação shell script e pode salvar muitas linhas de código e processamento do hardware.

Como muitas coisas em programação shell, é muito mais fácil mostrar do que tentar explicar, por isso vamos a alguns exemplos.

Exemplo 1:
$ echo $VALOR

$ echo ${VALOR:-10}
10
$ echo $VALOR

Na primeira linha eu imprimo a variável $VALOR e como a variável ainda não havia sido declarada, ela ainda não existe e por isso não possui conteúdo.
Na segunda linha é que a brincadeira começa a ficar legal. Eu faço a mesma coisa, porém faço uma expansão de parâmetro, que significa: Se a variável não existir ou existir e for nula, retorne o valor “10”. Quem programa sabe que esta expansão de parâmetro é muito útil.
Na terceira linha eu imprimo novamente a variável $VALOR e ela continua não existindo. Entenda isso como sendo o valor padrão de uma variável caso ela não exista ou seja nula.

Como você percebeu, é necessário utilizar chaves {} nas variáveis para que a expansão de parâmetro funcione como esperado.

Exemplo 2:
$ echo $VALOR

$ echo ${VALOR:=10}
10
$ echo $VALOR
10

Percebeu a diferença? A  expansão “:=” declarou a variável com o conteúdo “10”. Agora a variável passa a existir com o conteúdo “10”.

Exemplo 3:
$ echo $VALOR1

$ echo ${VALOR1?Variável não existe}
bash: VALOR1: Variável não existe

Não precisa explicar esse exemplo né?

Exemplo 4:
$ VALOR1=”um valor qualquer”
$ echo ${VALOR1:+1}
1

O exemplo 4 mostra uma expansão de parâmetro muito útil para testar se uma variável existe e possui conteúdo. Colocando isso na prática, seria assim:

Exemplo 5:
$ [ “${VALOR1:+1}” = “1” ] && echo “Variável existe.” || echo “Variável não existe.”
Variável existe.
$ unset VALOR1
$ [ “${VALOR1:+1}” = “1” ] && echo “Variável existe.” || echo “Variável não existe.”
Variável não existe.

Neste exemplo eu utilizo um teste de comparação para decidir qual ação tomar e depois eu apago a variável com o comando “unset” e repito o teste.

Se você está aprendendo a programar agora, provavelmente ainda não sabe o que é substring mas saiba que é algo muito utilizado em linguagens de programação e com bash não poderia ser diferente. Basicamente é retornar o conteúdo de uma variável a partir de uma posição de caractere, sendo 0 o primeiro. Veja o exemplo abaixo para entender melhor sobre isso.

Exemplo 6:
$ VALOR=”012345”

# Retornar o conteúdo da variável $VALOR a partir da posição 3
$ echo ${VALOR:3}
345

# Retornar 2 caracteres a partir da posição 0
$ echo ${VALOR:0:2}
01

# Retornar o comprimento da variável $VALOR
$ echo ${#VALOR}
6

Ainda falando sobre substring, os dois tipos de expansão de parâmetro abaixo são igualmente úteis e podem economizar bastante recurso de hardware e linhas de código.

Exemplo 7:
$ VALOR=”A:B:C:D:E”

# Eliminar a menor parte da frente para trás se o início do conteúdo da variável coincidir com “:”
$ echo ${VALOR#*:}
B:C:D:E

# Eliminar a maior parte da frente para trás se o início do conteúdo da variável coincidir com “:”
$ echo ${VALOR##*:}
E

# Eliminar a menor parte de trás para frente se o final do conteúdo da variável coincidir com “:”
$ echo ${VALOR%:*}
A:B:C:D

# Eliminar a maior parte de trás para frente se o final do conteúdo da variável coincidir com “:”
$ echo ${VALOR%%:*}
A

Veja que o que diferencia se a expansão de parâmetro será gulosa ou não é a utilização de um (%, #) ou dois (%%, ##).

Também e possível fazer substituições com expansão de parâmetro, veja o exemplo abaixo.

Exemplo 8:
$ VALOR=”A:B:C:D:E”

# Substituir B por b
$ echo ${VALOR/B/b}
A:b:C:D:E

# Substituir a primeira ocorrência de “:” por “@” 
$ echo ${VALOR/:/@}
A@B:C:D:E

# Substituir todas as ocorrências de “:” por “@”
$ echo ${VALOR//:/@}
A@B@C@D@E

Perceba novamente que o que instrui a expansão de parâmetro a ser gulosa ou não, é a utilização de uma “/” ou duas “//”.

Agora que você já sabe tudo sobre expansão de parâmetro com variáveis, que tal um desafio?

A=”012345”

Transforme o conteúdo da variável $A em “5:4:3:2:1:0” utilizando apenas expansão de parâmetro de substring em um one-liner.

Deixe a sua melhor resposta nos comentários abaixo.

Até o próximo artigo e mais um conteúdo sobre programação shell.

Comentários

comentários