Declarando variáveis
No Bash, variáveis são criadas por atribuição direta. Não pode haver espaços ao redor do =.
NOME="Linux Labs"
VERSAO=6
readonly PI=3.14
O comando declare permite definir atributos. Use -i para inteiros, -r para somente leitura e -a para arrays.
declare -i CONTADOR=0
CONTADOR+=5
echo $CONTADOR
5
export e escopo
Variáveis comuns existem apenas no shell atual. Para que processos filhos as enxerguem, use export.
LINGUAGEM="pt_BR.UTF-8"
export LINGUAGEM
# ou em uma linha:
export EDITOR="vim"
Para verificar todas as variáveis exportadas:
export -p | head -5
declare -x EDITOR="vim"
declare -x HOME="/root"
declare -x LANG="pt_BR.UTF-8"
declare -x LINGUAGEM="pt_BR.UTF-8"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
Expansão de variáveis
Existem várias formas de expandir o valor de uma variável:
ARQUIVO="relatorio"
echo $ARQUIVO # simples
echo ${ARQUIVO}.log # com sufixo (evita ambiguidade)
echo ${ARQUIVO:-vazio} # valor padrão se não definida
echo ${#ARQUIVO} # comprimento da string
relatorio
relatorio.log
relatorio
10
Substituição de comando
Use $(comando) para capturar a saída de um comando dentro de uma variável. A sintaxe com crases `comando` ainda funciona, mas é desencorajada.
HOJE=$(date +%Y-%m-%d)
KERNEL=$(uname -r)
USERS_LOGADOS=$(who | wc -l)
echo "Data: $HOJE | Kernel: $KERNEL | Usuários: $USERS_LOGADOS"
Data: 2026-03-27 | Kernel: 6.6.87-generic | Usuários: 3
Variáveis especiais
O Bash disponibiliza variáveis especiais que são essenciais em scripts:
echo $? # código de saída do último comando
echo $$ # PID do shell atual
echo $! # PID do último processo em background
echo $# # número de argumentos do script
echo $@ # todos os argumentos (como palavras separadas)
echo $0 # nome do script
Exemplo prático em um script:
#!/bin/bash
echo "Script: $0"
echo "Argumentos recebidos: $#"
echo "Primeiro: $1 | Segundo: $2"
echo "Todos: $@"
$ ./info.sh alfa beta gama
Script: ./info.sh
Argumentos recebidos: 3
Primeiro: alfa | Segundo: beta
Todos: alfa beta gama
Aspas simples vs duplas
Essa distinção é fundamental e fonte de muitos bugs.
DISTRO="Debian"
echo "Eu uso $DISTRO" # expande a variável
echo 'Eu uso $DISTRO' # literal, sem expansão
Eu uso Debian
Eu uso $DISTRO
Aspas duplas preservam espaços e expandem variáveis. Aspas simples tratam tudo como texto literal.
"$VAR" para evitar problemas com word splitting e globbing. A exceção é quando você intencionalmente quer que o shell divida a string em palavras.