Ubuntu Primeiro Script
Um shell script é um arquivo de texto com comandos, um por linha, que o bash executa em sequência. Tudo o que você digita no terminal pode virar script. Assim, uma tarefa de dez comandos vira um comando só, que você roda quando quiser ou agenda para rodar sozinho.
- Criar um script e entender a primeira linha (o shebang).
- Por que aparece "Permissão negada" e como o
chmod +xresolve. - Cinco formas de executar um script, e o que muda entre elas.
- O código de saída: como o script avisa se deu certo.
- Deixar o script mais seguro com
set -euo pipefaile achar erros combash -x.
Antes de começar: onde guardar os scripts
Crie uma pasta só para eles. A Ana vai usar ~/scripts:
$ mkdir -p ~/scripts $ cd ~/scripts
Mais adiante você vai ver como rodar os scripts dessa pasta de qualquer lugar.
Passo 1: escrever o script
Abra o editor com nano ola.sh e digite o conteúdo abaixo. A extensão .sh não é obrigatória, mas ajuda a reconhecer o que é script.
#!/usr/bin/env bash # ola.sh — meu primeiro script # Mostra uma saudação, a data e a pasta atual. echo "Olá, $USER!" echo "Hoje é $(date +%d/%m/%Y)." echo "Você está em: $(pwd)"
Salve com Ctrl+O, Enter, e saia com Ctrl+X. Veja o que cada linha faz:
- #!/usr/bin/env bash
- O shebang: diz qual programa deve ler o arquivo. Precisa ser a primeira linha.
- # ola.sh — …
- Um comentário: toda linha que começa com
#é ignorada pelo bash. Serve para explicar o script. - echo "Olá, $USER!"
- Mostra um texto.
$USERé trocado pelo nome do usuário. - $(date +%d/%m/%Y)
- Roda o
datee coloca a saída dele dentro do texto.
O shebang em detalhe
O nome vem de sharp (#) + bang (!). Quando você executa o arquivo, o sistema lê essa linha e chama o programa indicado para interpretar o resto.
| Shebang | Significado |
|---|---|
#!/usr/bin/env bash | "Procure o bash no PATH e use-o." Funciona mesmo que o bash esteja em outra pasta. É a forma recomendada. |
#!/bin/bash | Usa o bash nesse caminho exato. No Ubuntu, funciona igual. |
#!/bin/sh | Usa o sh, que no Ubuntu é o dash: mais rápido, mas sem vários recursos do bash. |
#!/usr/bin/env python3 | O mesmo truque serve para outras linguagens. |
Passo 2: executar
A forma mais simples é entregar o arquivo ao bash. Não precisa de nenhuma preparação:
- bash
- O interpretador.
- ola.sh
- O arquivo que ele vai ler e executar.
$ bash ola.sh Olá, ana! Hoje é 15/10/2026. Você está em: /home/ana/scripts
Agora tente rodar como um programa, com ./ na frente. O ./ significa "o arquivo que está nesta pasta":
$ ./ola.sh bash: ./ola.sh: Permissão negada $ echo $? 126 « 126 = existe, mas não pode ser executado
Todo arquivo novo nasce sem permissão de execução, por segurança. Veja o ls -l: não há nenhum x.
$ ls -l ola.sh -rw-rw-r-- 1 ana ana 187 Oct 15 10:30 ola.sh
Dar permissão de execução: chmod +x
- chmod
- Change mode: muda as permissões (veja chmod).
- +x
- Acrescenta (
+) a permissão de execução (x). - ola.sh
- O arquivo.
$ chmod +x ola.sh $ ls -l ola.sh -rwxrwxr-x 1 ana ana 187 Oct 15 10:30 ola.sh « agora tem x $ ./ola.sh Olá, ana! Hoje é 15/10/2026. Você está em: /home/ana/scripts
Missão: a máquina fictícia já tem um script pronto e executável em Documentos/projetos/backup.sh. Veja o conteúdo dele com cat, confira o x nas permissões com ls -l, rode-o com ./Documentos/projetos/backup.sh e veja o código de saída com echo $?.
Cinco formas de executar um script
| Forma | Precisa de x? | Usa o shebang? | Quando usar |
|---|---|---|---|
bash ola.sh | Não | Não (sempre bash) | Testar rápido; rodar script baixado sem mudar permissões. |
./ola.sh | Sim | Sim | O jeito normal, estando na pasta do script. |
~/scripts/ola.sh | Sim | Sim | De qualquer pasta, com o caminho completo. É o jeito certo no cron. |
ola.sh (só o nome) | Sim | Sim | Quando a pasta do script está no PATH. |
source ola.sh | Não | Não | Quando o script deve mudar o seu terminal (variáveis, cd). |
Rodar só pelo nome
Sem o ./, o bash procura o nome nas pastas do PATH e não olha a pasta atual:
$ ola.sh ola.sh: comando não encontrado $ echo $? 127 « 127 = comando não encontrado
Para resolver, coloque o script numa pasta do PATH. O Ubuntu já inclui ~/.local/bin no PATH, se a pasta existir:
$ mkdir -p ~/.local/bin $ cp ola.sh ~/.local/bin/ola $ ola « funcionará depois de sair e entrar na sessão Olá, ana! Hoje é 15/10/2026. Você está em: /home/ana/scripts
Repare que tiramos o .sh do nome: assim o script parece um comando qualquer. Se a pasta foi criada agora, saia e entre de novo na sessão (ou rode source ~/.profile) para o PATH incluí-la. Veja .bashrc, alias e PATH.
source: rodar dentro do terminal atual
Normalmente, o script roda num bash separado, que termina quando o script acaba. Por isso um cd dentro do script não muda a pasta do seu terminal. Com source, os comandos rodam no seu bash:
#!/usr/bin/env bash cd ~/Documentos/projetos echo "Entrei em $(pwd)"
$ bash vai.sh Entrei em /home/ana/Documentos/projetos $ pwd /home/ana/scripts « o terminal continuou onde estava $ source vai.sh Entrei em /home/ana/Documentos/projetos $ pwd /home/ana/Documentos/projetos « com source, o cd valeu aqui
O que o script devolve: o código de saída
Todo script termina com um código de saída. Por padrão, é o código do último comando que rodou. Você pode escolher com exit:
#!/usr/bin/env bash
# Avisa se a pasta de backup existe.
if [ -d "$HOME/backup" ]; then
echo "Pasta de backup encontrada."
exit 0
else
echo "Pasta de backup NÃO existe!"
exit 1
fi
$ ./verifica.sh Pasta de backup NÃO existe! $ echo $? 1 $ ./verifica.sh && echo "pode continuar" || echo "algo deu errado" Pasta de backup NÃO existe! algo deu errado
O if será explicado em Condicionais. Por enquanto, guarde a tabela:
| Código | Significado |
|---|---|
0 | Sucesso. |
1 | Erro genérico (o mais comum). |
2 | Uso errado do comando ou erro de sintaxe. |
126 | O arquivo existe, mas não pode ser executado (falta x). |
127 | Comando não encontrado. |
130 | Interrompido com Ctrl+C. |
Um script útil: resumo do sistema
Juntando comandos que você já conhece, a Ana fez um script que mostra o estado da máquina:
#!/usr/bin/env bash # resumo — mostra o estado da máquina em poucas linhas echo "=== $(hostname) — $(date '+%d/%m/%Y %H:%M') ===" echo "Ligado há: $(uptime -p)" echo echo "Disco (/):" df -h / | tail -1 echo echo "Memória:" free -h | grep Mem
$ chmod +x ~/.local/bin/resumo $ resumo === notebook — 15/10/2026 10:30 === Ligado há: up 2 hours, 31 minutes Disco (/): /dev/nvme0n1p2 468G 121G 324G 28% / Memória: Mem.: 15Gi 5,2Gi 6,1Gi 412Mi 4,3Gi 10Gi
Scripts mais seguros: set -euo pipefail
Por padrão, o bash é tolerante demais: se um comando falha, ele segue para o próximo como se nada tivesse acontecido. Num script que apaga ou move arquivos, isso é perigoso. Coloque esta linha logo depois do shebang:
- set
- Muda o comportamento do bash.
- -e
- Para o script no primeiro comando que falhar.
- -u
- Trata como erro o uso de uma variável que não existe (um erro de digitação, por exemplo).
- -o pipefail
- Num pipe (
a | b), considera que falhou se qualquer parte falhar, não só a última.
#!/usr/bin/env bash set -euo pipefail ls /pasta-que-nao-existe echo "Esta linha nunca será executada."
$ bash seguro.sh ls: não é possível acessar '/pasta-que-nao-existe': Arquivo ou diretório inexistente $ echo $? 2 « parou no erro e devolveu o código do ls
Veja o -u pegando um erro de digitação. A variável certa era $NOME:
$ cat digitacao.sh #!/usr/bin/env bash set -u NOME="Ana" echo "Oi $NOEM" $ bash digitacao.sh digitacao.sh: linha 4: NOEM: variável não associada
Sem o set -u, o script mostraria só "Oi " e seguiria em frente, sem avisar.
Encontrar erros: bash -x e shellcheck
Com -x, o bash mostra cada comando antes de executá-lo, já com as variáveis substituídas. As linhas que começam com + são o "rastro":
$ bash -x ola.sh + echo 'Olá, ana!' « o comando, já com $USER trocado Olá, ana! « a saída dele ++ date +%d/%m/%Y « ++ = rodou dentro de $( ) + echo 'Hoje é 15/10/2026.' Hoje é 15/10/2026. ++ pwd + echo 'Você está em: /home/ana/scripts' Você está em: /home/ana/scripts
Se uma variável estiver vazia ou com valor errado, você vê na hora, na linha com +.
O shellcheck lê o script e aponta erros e más práticas antes de você rodar. Instale com sudo apt install shellcheck:
$ shellcheck apaga.sh
In apaga.sh line 3:
rm -rf $PASTA/*
^-----^ SC2086 (info): Double quote to prevent globbing and word splitting.
^-----^ SC2115 (warning): Use "${var:?}" to ensure this never expands to /* .
O aviso SC2115 é sério: se $PASTA estiver vazia, o comando vira rm -rf /*. Saída ilustrativa.
Quando não funciona
$ ./backup.sh bash: ./backup.sh: Permissão negada
O que aconteceu: o arquivo não tem permissão de execução.
Como resolver: chmod +x backup.sh, ou rode com bash backup.sh. Se o arquivo estiver num pendrive FAT32 ou NTFS, o chmod não funciona lá: use bash ou copie para a pasta pessoal.
$ backup.sh backup.sh: comando não encontrado
O que aconteceu: sem ./, o bash só procura nas pastas do PATH.
Como resolver: use ./backup.sh, o caminho completo, ou mova o script para ~/.local/bin.
env: $'bash\r': No such file or directory
$ ./script-do-windows.sh env: $'bash\r': No such file or directory env: use -[v]S to pass options in shebang lines
O que aconteceu: o arquivo foi salvo no Windows, que termina cada linha com dois caracteres (\r\n) em vez de um (\n). O sistema procurou um programa chamado "bash\r".
Como resolver: remova os \r com sed -i 's/\r$//' script-do-windows.sh, ou instale e use dos2unix.
[[: not found ao rodar com sh
$ sh testa.sh testa.sh: 2: [[: not found
O que aconteceu: no Ubuntu, sh é o dash, que não entende recursos do bash como [[ ]]. Rodar sh script.sh ignora o shebang.
Como resolver: rode com bash testa.sh ou ./testa.sh.
$ bash verifica.sh verifica.sh: linha 9: erro de sintaxe: fim inesperado do arquivo do comando `if' na linha 3
O que aconteceu: um bloco aberto não foi fechado: faltou o fi de um if, o done de um laço, ou uma aspa.
Como resolver: olhe a linha indicada no fim da mensagem (na linha 3) e procure o fechamento. O shellcheck aponta o lugar exato.
Referência
| Item | O que faz |
|---|---|
#!/usr/bin/env bash | Shebang: escolhe o interpretador |
# texto | Comentário |
chmod +x script | Permite executar |
bash script | Executa sem precisar de x |
./script | Executa o script da pasta atual |
source script | Executa no shell atual |
exit N | Termina o script com o código N |
echo $? | Mostra o código do último comando |
set -euo pipefail | Para no primeiro erro; proíbe variáveis inexistentes |
bash -x script | Mostra cada comando ao executar |
bash -n script | Só verifica a sintaxe, sem executar |
shellcheck script | Aponta erros e más práticas |
Exercícios
1. Primeira linha
Complete o shebang recomendado:
2. Permissão de execução
Complete para poder rodar ./limpa.sh:
3. Modo seguro
Complete a linha que faz o script parar no primeiro erro e recusar variáveis inexistentes:
4. ./backup.sh responde "Permissão negada" e echo $? mostra 126. O que falta?
5. Um script faz cd /tmp. Depois de ./script.sh, em que pasta o seu terminal está?
Resumo
- Script = arquivo de texto com comandos. A primeira linha é o shebang:
#!/usr/bin/env bash. bash script.shroda sem preparação; para./script.sh, antes rodechmod +x.- Para rodar pelo nome, guarde em
~/.local/bin.sourceroda dentro do terminal atual. - O código de saída diz se deu certo: 0 é sucesso, 126 é "sem permissão", 127 é "não encontrado".
- Use
set -euo pipefail, depure combash -xe revise comshellcheck.