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.

Você vai aprender
  • Criar um script e entender a primeira linha (o shebang).
  • Por que aparece "Permissão negada" e como o chmod +x resolve.
  • 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 pipefail e achar erros com bash -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 date e 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.

ShebangSignificado
#!/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/bashUsa o bash nesse caminho exato. No Ubuntu, funciona igual.
#!/bin/shUsa o sh, que no Ubuntu é o dash: mais rápido, mas sem vários recursos do bash.
#!/usr/bin/env python3O 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

FormaPrecisa de x?Usa o shebang?Quando usar
bash ola.shNãoNão (sempre bash)Testar rápido; rodar script baixado sem mudar permissões.
./ola.shSimSimO jeito normal, estando na pasta do script.
~/scripts/ola.shSimSimDe qualquer pasta, com o caminho completo. É o jeito certo no cron.
ola.sh (só o nome)SimSimQuando a pasta do script está no PATH.
source ola.shNãoNãoQuando 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ódigoSignificado
0Sucesso.
1Erro genérico (o mais comum).
2Uso errado do comando ou erro de sintaxe.
126O arquivo existe, mas não pode ser executado (falta x).
127Comando não encontrado.
130Interrompido 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

"Permissão negada"
$ ./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.

"comando não encontrado" com o arquivo bem ali
$ 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.

"erro de sintaxe: fim inesperado do arquivo"
$ 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

ItemO que faz
#!/usr/bin/env bashShebang: escolhe o interpretador
# textoComentário
chmod +x scriptPermite executar
bash scriptExecuta sem precisar de x
./scriptExecuta o script da pasta atual
source scriptExecuta no shell atual
exit NTermina o script com o código N
echo $?Mostra o código do último comando
set -euo pipefailPara no primeiro erro; proíbe variáveis inexistentes
bash -x scriptMostra cada comando ao executar
bash -n scriptSó verifica a sintaxe, sem executar
shellcheck scriptAponta erros e más práticas

Exercícios

1. Primeira linha

Complete o shebang recomendado:

#!/usr/bin/env

2. Permissão de execução

Complete para poder rodar ./limpa.sh:

chmod limpa.sh

3. Modo seguro

Complete a linha que faz o script parar no primeiro erro e recusar variáveis inexistentes:

set

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.sh roda sem preparação; para ./script.sh, antes rode chmod +x.
  • Para rodar pelo nome, guarde em ~/.local/bin. source roda 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 com bash -x e revise com shellcheck.