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

    Página 1

       Notações usadas
       Como instalar?
       Shell Script Sintaxe básica
           História do Bash      
           Comandos, arquivos e diretórios
           Criando um Script

    Página 2

       Metacaracteres
       Documentação de programas
       Comandos indispensáveis
          Grep
          Cut
          Sed
          Head/Tail

    Página 3

       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

    Página 4

       Expressões Booleanas
       Expressões Aritméticas
       Condicional If
       Condicional Implícito
       Estruturas de repetição
          For
          While
          Until
       Funções
       Trap trantando sinais

    Página 5

       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

    Página 6 (Truques)

       Bloco de texto
       Mais vetores e strings
       Expressões ariméticas mais elaboradas
       O bashrc

    Página 7 (Exemplos de scripts)

       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