Fundamentos de Scripts Bash: Variáveis, Controle de Fluxo e Exemplos Práticos

A primeira linha de um script Bash deve apontar para o interpretador correto, normalmente #!/bin/bash. Para executar o arquivo diretamente, é necessário conceder permisão de execução:

chmod +x script.sh
./script.sh

Exemplo de script mínimo:

#!/bin/bash
echo "Olá, mundo!"

Variáveis

O shell separa variáveis de ambiente e variáveis definidas pelo usuário. Use o prefixo $ para acessar o valor:

echo "Usuário: $USER"
echo "Diretório pessoal: $HOME"

Para definir uma variável, não use espaços em volta do sinal de igual e prefira nomes em maiúsculas:

MSG="Bem-vindo"
VERSAO=2
echo "$MSG - v$VERSAO"

# variável somente leitura
readonly MAXIMO=100

# substituição de comando
LISTA=$(ls -la)
echo "$LISTA"

Variáveis de ambiente

Para tornar um valor disponível para outros processos, use export e recarregue a configuração:

# env.conf
export APP_HOME=/opt/minhaapp
source ./env.conf
echo "$APP_HOME"

Parâmetros posicionais

echo "Script: $0" echo "Primeiro parâmetro: $1" echo "Segundo parâmetro: $2" echo "Quantidade: $#" echo "Todos como uma string: $*" echo "Cada parâmetro separado: {10}


<p>A diferença entre <code>$*</code> e <code>$@</code> aparece em laços:</p>
<code>for item in "$*"; do echo "$item"; done
for item in "$@"; do echo "$item"; done</code>

<h2>Variáveis pré-definidas</h2>
<code>echo "PID atual: $$"
echo "Código de saída do último comando: $?"</code>

<h2>Aritmética</h2>
<code>A=12
B=5
echo $((A + B))

expr 12 + 5
expr 12 \* 5</code>

<h2>Testes condicionais</h2>
<p>Use colchetes com espaços internos. Condições numéricas: <code>-eq</code>, <code>-ne</code>, <code>-lt</code>, <code>-le</code>, <code>-gt</code>, <code>-ge</code>. Condições de strings: <code>=</code>, <code>!=</code>. Condições de arquivos: <code>-e</code>, <code>-f</code>, <code>-d</code>, <code>-r</code>, <code>-w</code>, <code>-x</code>.</p>
<code>if [ "$1" = "ok" ]; then
    echo "igual"
fi

if [ -f /tmp/dados.txt ]; then
    echo "arquivo existe"
fi</code>

<h2>Controle de fluxo</h2>

<h3>if/elif/fi</h3>
<code>NOTA=$1
if [ "$NOTA" -ge 60 ]; then
    echo "Aprovado"
elif [ "$NOTA" -lt 60 ]; then
    echo "Reprovado"
fi</code>

<h3>case</h3>
<code>case "$1" in
    "1") echo "Segunda-feira" ;;
    "2") echo "Terça-feira" ;;
    *) echo "Outro dia" ;;
esac</code>

<h3>for</h3>
<code>for arg in "$@"; do
    echo "Argumento: $arg"
done</code>

<h3>while</h3>
<code>SOMA=0
I=1
while [ "$I" -le "$1" ]; do
    SOMA=$((SOMA + I))
    I=$((I + 1))
done
echo "Soma: $SOMA"</code>

<h2>Entrada do usuário com read</h2>
<code>read -p "Digite um número: " NUM1
echo "Valor 1: $NUM1"

read -t 10 -p "Digite outro número (limite 10s): " NUM2
echo "Valor 2: $NUM2"</code>

<h2>Funções</h2>

<h3>Funções do sistema</h3>
<code>CAMINHO=/var/log/sistema/app.log
baseanme "$CAMINHO"
basename "$CAMINHO" .log
dirname "$CAMINHO"</code>

<h3>Funções definidas pelo usuário</h3>
<code>function somar() {
    local X=$1
    local Y=$2
    echo $((X + Y))
}

read -p "Primeiro operando: " A
read -p "Segundo operando: " B
RESULTADO=$(somar "$A" "$B")
echo "Resultado: $RESULTADO"</code>

<h2>Exemplo prático: calculadora</h2>
<code>#!/bin/bash

function calcular() {
    local OP=$2
    case "$OP" in
        "+") echo $(($1 + $3)) ;;
        "-") echo $(($1 - $3)) ;;
        "x"|"X") echo $(($1 * $3)) ;;
        "/") echo $(($1 / $3)) ;;
        *) echo "Operador inválido" ;;
    esac
}

if [ $# -eq 3 ]; then
    calcular "$1" "$2" "$3"
else
    echo "Uso: $0 <n1> <op> <n2>"
fi</code>

<h2>Exemplo prático: backup de banco de dados</h2>
<code>#!/bin/bash

DESTINO=/root/practice/data/backup/db
AGORA=$(date +%Y_%m_%d_%H%M%S)
HOST=localhost
USUARIO=root
SENHA=root
BANCO=dataset_one

echo "Iniciando backup de $BANCO"
mkdir -p "$DESTINO/$AGORA"

mysqldump -u"$USUARIO" -p"$SENHA" --host="$HOST" "$BANCO" | gzip > "$DESTINO/$AGORA/$AGORA.sql.gz"

cd "$DESTINO"
tar -zcvf "$AGORA.tar.gz" "$AGORA"
rm -rf "$DESTINO/$AGORA"

find "$DESTINO" -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "Backup finalizado."</code>

<p>Para executar o backup periodicamente, adicione uma entrada no <code>crontab</code>:</p>
<code>0 2 * * * /caminho/backup.sh</code>

<h2>Dica: erro de sintaxe com <code>sh</code></h2>
<p>Em distribuições onde <code>/bin/sh</code> aponta para o <code>dash</code>, construções como <code>function nome()</code> podem gerar <code>Syntax error: "(" unexpected</code>. Prefira execuatr o script explicitamente com Bash:</p>
<code>bash script.sh</code>

Tags: Bash Shell Script Linux MySQL crontab

Publicado em 10-14 23:46