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>