Percursos
/
Bash
Bash
/
Programa
/
Variáveis
Va

Variáveis em Bash

{one: "1 exercício", many: "%{count} exercícios", other: "%{count} exercícios"}

Sobre Variáveis

Variáveis

As variáveis são um local para guardar dados. O bash tem dois tipos de dados: strings e arrays. Vamos falar dos arrays mais adiante.

Atribuis um valor a uma variável assim

name="value"
Note

Importante: não pode haver espaços à volta do sinal de igual!

Quando existem espaços, como neste exemplo,

x = 10

o bash vai chamar o comando x com os dois argumentos = e 10!

As variáveis também podem ser chamadas parâmetros. Os dois termos serão usados indistintamente neste documento.

Alguns parâmetros importantes usados ou definidos pelo bash incluem:

  • PATH: uma lista de diretórios separados por dois pontos, usada para encontrar comandos externos.
  • IFS: o "separador interno de campos". Vamos ver como se usa mais abaixo.
  • PWD: o teu diretório de trabalho atual. Terá o mesmo valor que a saída do comando pwd.
  • RANDOM: um número inteiro pseudoaleatório entre 0 e 32767.
  • BASH_VERSION: a string com a versão da instância do bash em execução.

Nomes de variáveis

Um nome de variável é composto por letras maiúsculas, letras minúsculas, números e underscores. Não pode começar por um número.

Caution

É boa prática evitar nomes de variáveis todas em maiúsculas. O shell usa esta convenção para os seus parâmetros, e não queres sobrescrever acidentalmente parâmetros do shell que têm um significado especial. Por exemplo: 1, 2, 3

Expansão de parâmetros

Obténs o valor de um parâmetro com a sintaxe $varname.

x=10
echo "The value of x is $x"

Para evitar que o nome da variável se confunda com o texto à volta, podes envolver o nome da variável em chavetas. Por exemplo, para imprimir a string 10x10

echo "${x}x$x"
# or
echo "${x}x${x}"

Alguns guias de estilo recomendam usar chavetas na maioria dos casos, por questões de legibilidade e/ou consistência.

Parâmetros posicionais

Como vimos na lição Comandos e argumentos, os comandos podem receber argumentos. Os scripts de bash não são exceção. Os argumentos passados à instância atual do bash chamam-se parâmetros posicionais. Podem ser obtidos com estes parâmetros especiais:

  • $1: o primeiro parâmetro posicional
  • $2 ... $9: os parâmetros seguintes
  • ${10} ...: os números com dois dígitos exigem chavetas.
  • $0: o nome do script atual.

Os argumentos de uma função do shell também são parâmetros posicionais, tratados exatamente da mesma forma. Veremos mais sobre funções numa lição mais adiante.

Parâmetros posicionais especiais

Existem alguns parâmetros especiais que te ajudam a trabalhar com os parâmetros posicionais.

  • $# expande-se para o número de parâmetros posicionais.
  • "$@" expande-se para a lista de todos os parâmetros posicionais, cada um como uma palavra separada.
  • "$*" expande-se para uma única string com todos os parâmetros posicionais unidos por um caráter.
    • O caráter de junção é o primeiro caráter da variável $IFS, que por predefinição é um espaço.

O "$@" é a forma mais segura de passar parâmetros posicionais a outro comando, mantendo-os devidamente entre aspas. É também o que vais usar para percorrer os parâmetros posicionais:

for arg in "$@"; do
    do_something_with "$arg"
done

Na prática, usa-se mais o "$@" do que o "$*".

Substituição de comandos

Uma operação muito frequente em scripts de bash é capturar a saída de um comando e guardá-la numa variável. Para isso, usas a substituição de comandos.

var=$(command)

Por exemplo, para converter uma string em maiúsculas, podes fazer isto:

text="Hello world!"
uppercase=$(echo "$text" | tr '[:lower:]' '[:upper:]')
echo "$uppercase"
# => HELLO WORLD!

Mais sobre expansão de parâmetros

O bash tem muitas funcionalidades incorporadas para manipular variáveis e strings, para que não precises de chamar comandos externos.

  • Converter texto em maiúsculas. Na secção anterior mostrei como usar o tr para converter texto em maiúsculas. Para o fazer em bash:

    echo "${text^^}"
    

    De forma semelhante, ${text,,} passa o valor para minúsculas.

  • Fornecer um valor predefinido se a variável estiver vazia.

    default="nothing here"
    result=""
    echo "${result:-$default}"
    # => nothing here
    
  • Procurar e substituir.

    text="Hello world!"
    echo "${text//[aeiou]/X}"
    # => HXllX wXrld!"
    

Há muitas outras expansões de parâmetros interessantes: extrair uma substring, obter o comprimento da string, atribuir um valor predefinido, remover texto do início ou do fim do valor, e muito mais. Podes ler sobre elas no manual.

Editar via GitHub A ligação abre numa nova janela ou separador