Shell Script
Este pequeno guia
é um conjunto de conceitos escritos por mim que tem como
objetivo ensinar estudantes, acadêmicos e profissionais de
informática como usar o interpretador shell para automatizar
tarefas. O livro ensina o leitor a linguagem de shell, como ela surgiu
e quais os usos dela. Como criar um script e usar as estrutura
básicas dele. Aplicação de
manipulação de recursos periféricos, e capacitar a
programação de tarefas grandes ou complexas.
Sumário
Notações
usadas
Como
instalar?
Shell
Script Sintaxe básica
História do
Bash
Comandos, arquivos e
diretórios
Criando um Script
Metacaracteres
Documentação
de programas
Comandos
indispensáveis
Grep
Cut
Sed
Head/Tail
Entrada e
saída padrão
Redirecionamentos
Variáveis
de Ambiente
Argumentos
de scripts
Comando
shift
Vetores e
Listas
Escopo das
variáveis
Set/Unset
Comando Read
Redirecionamento
de saída
padrão para variável
Expressões
Booleanas
Expressões
Aritméticas
Condicional If
Condicional
Implícito
Estruturas
de repetição
For
While
Until
Funções
Trap
trantando sinais
Expressões
regulares
Mais
do grep e do Sed
Csh. Ksh,
Bash
Shell como
linguagem de
programação
Usando
arquivos temporários
Cuidados e
perigos
Saída
de erro e sinal de
saída
Entrada dos
comandos
Bloco de texto
Mais vetores
e strings
Expressões
ariméticas mais elaboradas
O bashrc
Sincronizando
repos. SVN
Fuçador
de URLS
Força
Bruta
Notações usadas
Durante todo o texto deste manual é usado algumas
notações:
Comandos que podem ser executados com
permissão de usuário são descritos com um
Cifrão “$” na frente, exemplo:
$ cp teste teste2
Comando executados que devem ser executados como
root possuem uma serquilha “#” na frente, exemplo:
# ifconfig eht0 down
Arquivos de script possuem na primeira linha o nome
do script em itálico, exemplo:
script_exemplo.sh
#!/bin/bash
echo exemplo
exit;
A primeira linha não faz parte do script
Simulação de execussão de um
script é feito, colocando cada linha executada com um “$” ou “#”
na frente e as mensagens de saída estão sem sinais. Os
comenstário delimitados com “<” e “>”. Exemplo:
# ls /sbin
fsck
isosize
mount.fuse tune2fs
<e mais alguns arquivos>
Como eu instalo o Shell?
Antes de mais nada, não se preocupe porque Shell também
pode não ser posto de gasolina. Existem diversos sabores de
shell: zsh, bash, csh, sh... Todos estes são nativos de sistemas
Unix (Linux, por exemplo), mas você pode e, é muito legal,
instalar o shell no Windows. Através do
Cygwin neste link. Depois
disso podemos começar!
Shell script, sintaxe básica
Aqui não me ative a explicar
administração de sistemas. É desejável
algum conhecimento em sistemas console, mas não muitos. A
função desse capítulo é apresentar a
sintaxe para nivelar os leitores que não conhecem as estruturas
básicas. Entretando shell script é uma linguagem
interpretada indispensável para administradores Unix.
A idéia de um shell foi concebida na
época em que a interface pela qual os usuários de
computadores podiam trabalhar com o computador era muito limitada.
Além disso os recursos eram limitados, CPU e memória.
Existia apenas um teclado, sem mouse, sem som, sem efeitos
gráficos bonitos. O modo pelo qual o usuário se comunica
com o computador nessa interface é escrevendo os programas que
se deseja abrir (ou se quiser entender como ordens ao computador) no
teclado e dando "enter". Para quem é usuário de windows
só lembrar do Dos, que nada mais é que um sistema para
operar discos com uma interface limitada de um shell. Os
interpretadores são vários, ksh, csh, zsh, sh e bash.
Entre os diversos interpretadores existentes os usuários de
Linux utilizam mais o bash. É como se os programas fossem
funções e o shell fosse a interação entre
os programas. Cada programa um disco e o shell é uma daquelas
caixas de musica anos 50 que você escolhe o que quer ouvir1.
1 Shell programming is a 1950s juke box . . ." Larry Wall
História do Bash
O bash é uma camada que liga o usuário com o sistema
operacional. Seu nome vêm de Bourne Again Shell uma
intertextualização com Bourne Shell, mais conhecido com
sh. O sh foi o pioneiro dos shells, a partir dele vieram os outros. O
Bourne shell foi escrito por Stephen Bourne um pesquisador da AT&T
Bell Labs. O bash é compatível com o sh e provê
algumas funcionalidades do csh e do ksh. Ele segue o padrão IEEE
Posix shell e inicialmente foi escrito para ser o shell padrão
do sistema GNU. Ele tem uma portabilidade boa, existem
implementações pra sistemas Windows, MacOsX e, é
claro, Linux e BSDs. Para usuários de Windows ele pode ser usado
através do projeto Cygwin. As funções são
praticamente todas portadas, só tendo dependência em
alguma funcionalidade do sistema Unix que o programador não pode
usar(como o /proc). Com o passar do tempo o bash evoluiu junto com os
sistemas abertos e hoje tem muitas mais funcionalidades e facilidades
que antigamente. Saber como programar em shell ajuda também na
administração do sistema. E praticamente se torna
indispensável pra um bom administrador.
Comandos, arquivos e diretórios
A interface de console é simples. Você
escreve o nome do programa e argumentos e aperta um enter. Você
navega por entre diretório de um sistema de arquivos. Os
arquivos possuem nomes que o usuário determina. Quando
você digita um comando o shell procura por alguns caminhos o
comando que você quer executar. Alguns desses comandos
são:
|
comando
|
Função
|
Argumento
|
|
ls
|
lista o conteúdo do
diretório corrente ou outro diretório passado por
argumento
|
Nome do diretório
|
|
cat
|
mostra o conteúdo de um
arquivo texto
|
Nome do arquivo
|
|
cd
|
muda o diretório corrente
|
Nome do diretório novo
|
|
pwd
|
mostra o diretório corrente
|
<Nenhum>
|
|
rm
|
remove arquivos e diretórios
|
Nome a remover
|
Em um sistema Unix por padrão os programas binários
usados para interagir com esse shell se encontram em diversos
diretórios de sistemas entre eles o /bin. O que não for
comando é tratado como nome de arquivo. O ls por exemplo
é um arquivo executável (programa) localizado em
/bin. Então quando você digita um ls, o efeito é o
mesmo de digitar /bin/ls. Recapitulando, quando o usuário digita
um ls, o shell procura em /bin arquivos executáveis cuja o nome
seja ls. E os executa. Em Unix apenas a permissão dos arquivos
especifica se ele é executável ou não. Não
existe a idéia da extensão do arquivo dizer sua
finalidade.
Também em unix a grande diferença
é que os caminhos pelo qual o shell procura os comandos
nunca está incluso o diretório corrente. Os comandos que
não estão nesses lugares especiais como /usr/bin, /bin
devem ser passados expressamente pelo caminho completo. Por isso quando
executar um arquivo no diretório corrente deve ser escrever
“./<arquivo>”. O "./" significa: forçar o shell a entender
que é pra executar o arquivo do diretório corrente. Isso
é motivo de segurança, caso contrário o
usuário corre o risco de ter um arquivo com o mesmo nome no seu
diretório corrente que faz coisas maliciosas. Imagine um arquivo
executável com o nome ls que apaga o seu home.
Criando um Script
Script em inglês significa roteiro. É exatamente isso que
será apresentado aqui. Para criar um script deve-se criar um
arquivo texto com diversos comandos. Estes comandos serão
executados em ordem. Exatamente como num roteiro. Para isso precisa ter
familiaridade com algum editor de textos. Todo arquivo
executável em Unix como eu falei anteriormente não tem
uma extensão específica. O que determina ele ser
executável é um bit na permissão do arquivo. Todo
arquivo executável em Unix quando chamado (se for
binário) é enviado ao carregador do sistema operacional.
Ele irá fazer a verificação do cabeçalho
”file format elf32-i386” ou similar. Caso não tenha um formato
suportado ele não será aberto. Se o arquivo for texto
(que é caso de um script) será procurado o “hashbang”
logo no início. Hashbang é o nome que se dá para
cerquilha exclamação (“#!”) que é um sinal que
identifica o interpretador. Caso não haja especificado o
interpretador o resultado é imprevisível dependendo do
seu sistema, implementação ou versão. Como o
interpretador tratado aqui é um shell podemos fazer um script
simples assim:
alomame
#!/bin/sh
echo Alo mamãe!
exit 0
Se esse arquivo foi salvo como alomamae, é preciso modificar a
permissão de execução. Isso é feito com
chmod +x alomamae. então execute-o com ./alomamae. Exit é
um comando shell usado para fechar o interpretador corrente. Logo
é possível concluir que toda vez que abrimos um script
ele será aberto num novo shell, pois quando executamos exit no
script ele não fecha o shell que estamos trabalhando. Esse
interpretador pode ser qualquer um deles ksh, csh, qualquer comando que
aceita o próprio arquivo como argumento. Por exemplo o cat (que
imprime na tela o conteúdo do arquivo passado como argumento)
cat.cat
#!/bin/cat
Arquivo de LEIAME
leia tudinho aqui a baixo
obrigado
Não confunda. O que acontece é que o próprio
arquivo é passado como argumento pro interpretador! Então
é possível por exemplo fazer um arquivo executável
com “#!/bin/rm” na primeira linha. O resultado é um arquivo que
“some” quando você executa, porque o shell fará rm
<arquivo>.
Próxima página