Shell Script 1 - O Básico
Você já leu o Papo de Botequim por Julio Cezar Neves? Se não, eu sugiro que leia, pois é um excelente material sobre Shell Script. Lá ele explica, dentre outras coisas, a diferença entre Bash e Shell. Bom, aqui eu vou mostrar apenas os comandos que eu considero mais relevantes, mas não deixe de ler o Papo de Botequim.
O que é Bash e Shell Script?
Bash é o interpretador e Shell Script é a linguagem.
A caixa de ferramentas do shelleiro
O Canivete Suíço do Shell (Bash) do Aurélio Marinho Jargas é o guia de referência de quem quer aprender Shell Script. E por isso vou reproduzir aqui os comandos que ele menciona em “A caixa de ferramentas do shelleiro”.
| Comando | Função | Opções úteis | 
|---|---|---|
| cat | Mostra arquivo | -n, -s | 
| cut | Extrai campo | -d -f, -c | 
| date | Mostra data | -d, +’…’ | 
| diff | Compara arquivos | -u, -Nr, -i, -w | 
| echo | Mostra texto | -e, -n | 
| find | Encontra arquivos | -name, -iname, -type f, -exec, -or | 
| fmt | Formata parágrafo | -w, -u | 
| grep | Encontra texto | -i, -v, -r, -qs, -n, -l, -w -x, -A -B -C | 
| head | Mostra início | -n, -c | 
| od | Mostra caracteres | -a, -c, -o, -x | 
| paste | Paraleliza arquivos | -d, -s | 
| printf | Mostra texto | nenhuma | 
| rev | Inverte texto | nenhuma | 
| pwd | Mostra o caminho do diretório atual | |
| sed | Edita texto | -n, -f, s/isso/aquilo/, p, d, q, N | 
| seq | Conta números | -s, -f | 
| sort | Ordena texto | -n, -f, -r, -k -t, -o | 
| tac | Inverte arquivo | nenhuma | 
| tail | Mostra final | -n, -c, -f | 
| tee | Arquiva fluxo | -a | 
| tr | Transforma texto | -d, -s, A-Z a-z | 
| top | Mostra os processos dinamicamente | |
| uniq | Remove duplicatas | -i, -d, -u | 
| wc | Conta letras | -c, -w, -l, -L | 
| which | Mostra a localização de um arquivo executável | |
| who | Mostra que está conectado | |
| whoami | Mostra o nome do usuário logado | |
| xargs | Gerencia argumentos | -n, -i | 
O Básico
Antes de sair explorando “A caixa de ferramentas do shelleiro”, vamos começar do começo.
Para abrir o terminal você pode pressionar Ctrl+Alt+T.

O $ é o prompt do comando, ou seja, a partir deste símbolo você pode digitar seus comandos.
Se você já leu alterando o prompt terminal você deve ter visto este prompt:
rg3915@acer:~/gh/grandeportal$ onde
usuario@maquina:caminho$E ~ é a pasta principal, a pasta home do usuário atual.
Esta é a configuração padrão do prompt de comando do terminal, mas se quiser, você pode mudar digitando, por exemplo.
PS1="$ "
Para todos os comandos digite
--help.
$ <comando> --helpArquivos e Diretórios
$ pwdMostra o nome e caminho do diretório atual.
Criando pastas
$ mkdir pastaprincipal
$ mkdir pasta1 pasta2 pasta3
$ mkdir -p novapasta/subpastaO argumento -p cria os diretórios pais à medida que forem necessários sem gerar erro. Ou seja, para criar subpasta primeiro ele cria novapasta.
Removendo pastas
$ rmdir pastaprincipalRemove o diretório se estiver vazio.
Criando arquivos vazios
$ touch arquivoprincipal.txt
$ touch arquivo1.txt arquivo2.txt arquivo3.txt
$ touch templates/{base.html,index.html,nav.html}Obs: Note que neste exemplo devemos criar a pasta templates antes.
Listando os arquivos
$ ls
$ ls -l
$ ls -la$ ls
arquivo1.txt  arquivo2.txt  arquivo3.txt  arquivoprincipal.txt-l esta opção usa o formato de listagem longa.
$ ls -l
total 16
-rw-rw-r-- 1 rg3915 rg3915 0 Mar  5 10:57 arquivo1.txt
-rw-rw-r-- 1 rg3915 rg3915 0 Mar  5 10:57 arquivo2.txt
-rw-rw-r-- 1 rg3915 rg3915 0 Mar  5 10:57 arquivo3.txt
-rw-rw-r-- 1 rg3915 rg3915 0 Mar  5 10:57 arquivoprincipal.txt-a mostra arquivos ocultos, que começam com .
$ ls -la
total 32
drwxrwxr-x 2 rg3915 rg3915 4096 Mar  5 10:57 .
drwxrwxr-x 3 rg3915 rg3915 4096 Mar  5 10:57 ..
-rw-rw-r-- 1 rg3915 rg3915    0 Mar  5 10:57 .env
-rw-rw-r-- 1 rg3915 rg3915    0 Mar  5 10:57 arquivo1.txt
-rw-rw-r-- 1 rg3915 rg3915    0 Mar  5 10:57 arquivo2.txt
-rw-rw-r-- 1 rg3915 rg3915    0 Mar  5 10:57 arquivo3.txt
-rw-rw-r-- 1 rg3915 rg3915    0 Mar  5 10:57 arquivoprincipal.txtNo exemplo, .env é um arquivo oculto.
Experimente
$ ls -lhVisualizando os arquivos numa árvore
$ sudo apt-get install tree
$ tree templates
$ tree --helpExcluindo arquivos e pastas
Depois de ler os comandos a seguir você vai entender o que o maluco fez quando excluiu todos os dados da empresa.
$ rm arquivoprincipal.txt
$ rm -i arquivoprincipal.txt
$ rm -f arquivoprincipal.txt
$ rm -rf novapasta
$ rm arquivo*.txt
$ rm *.txtCuidado: os comandos a seguir são extremamente perigosos!!!
$ rm *
$ rm -rf *Cuidado: O primeiro comando exclui todos os arquivos da pasta atual. O segundo exclui todos recursivamente e com force ativado, ou seja, exclui arquivos não-vazios sem perguntar.
Experimente
$ rm -rf \*Este comando anula o efeito excluir tudo.
Leia mais em cuidado com comandos perigosos do shell.
Copiando arquivos
cp arquivo.txt arquivo_bkp.txt
cp arquivo.txt /subpasta
cp * /subpasta
cp ~/Documentos .
cp -R ~/Documentos backup/Movendo arquivos
Move ou renomeia arquivos e diretórios. Semelhante ao cp, mas o arquivo de origem é apagado.
$ mv arquivo.txt backup/
$ mv arquivo.txt novo_nome.txtCriando links
O comando a seguir cria um link simbólico, o que comumente chamamos de atalho.
$ ln -s ~/Imagens/ imgDigitando cd img entramos na pasta ~/Imagens/ através do atalho.
Redirecionamento de Comandos
>
Redireciona a saída de um comando para outro arquivo. Se o arquivo existir será sobrescrito.
$ ls -la > dir.txt>>
Redireciona a saída, mas acrescentando os dados ao final do arquivo, sem sobrescrever o arquivo.
ls /etc/passwd >> dir.txt<
Redireciona a entrada.
wc -l < arquivoConta o número de linhas não vazias do arquivo.
Experimente:
cat << EOF > arquivo.txt
Z
X
C
B
A
EOFDepois
cat arquivo.txtDepois
sort < arquivo.txtPipes
Pipes ( | barra vertical) - permite que um programa utilize como entrada a saída de outro programa.
$ ls | wc -l$ echo Existem `who | wc -l` usuarios conectados$ ls -a | sort -rFaz com que o comando sort receba como entrada a saída produzida pelo comando ls. Neste exemplo o sort ordena na ordem reversa.
$ cat /etc/passwd | wc -l > lista.txtGrava no arquivo lista.txt o número de linhas do arquivo passwd.
Grep
Pesquisando em um arquivo específico.
$ grep force_color ~/.bashrcResultado:
force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
unset color_prompt force_color_promptPesquisando em todos os arquivos do tipo txt.
$ grep regis *.txtPesquisando na saída de um comando
$ who | grep rg3915$ ps aux | grep python$ curl http://www.meetup.com/pt-BR/Grupy-SP/events/232869373/ | grep Regis$ curl http://www.meetup.com/pt-BR/Grupy-SP/events/232869373/ | grep -c Python$ grep -i
$ grep --ignore-case$ grep -r
$ grep --recursive$ grep -c
$ grep --countecho
echo "Hello World"Experimente
echo {2..10}
echo {a..Z}echo azul{' claro',' escuro'}Tabulação
printf "Um\tDois"Quebra de linha
printf "Um\nDois"Leia mais em Shell Script 2 - Estruturas de Controle
