Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Introducao Shell
Apostila Introducao Shell
ndice
Sobre o curso.......................................................................................................................1 Apresentao ........................................................................................................................2 O que o shell............................................................................................................2 Shell script...................................................................................................................3 Antes de comear ........................................................................................................3 O primeiro shell script.........................................................................................................4 Passos para criar um shell script .................................................................................4 Problemas na execuo do script ................................................................................5 O primeiro shell script (melhorado) ....................................................................................6 Melhorar a sada na tela..............................................................................................6 Interagir com o usurio................................................................................................6 Melhorar o cdigo do script.........................................................................................7 Rebobinando a fita...............................................................................................................8 Variveis......................................................................................................................8 Detalhes sobre os comandos......................................................................................8 O comando test.........................................................................................................10 Tarefa: script que testa arquivos...............................................................................11 Conceitos mais avanados...............................................................................................12 Recebimento de opes e parmetros ......................................................................12 Expresses aritmticas ..............................................................................................12 If, for e while..............................................................................................................13 Exerccios...........................................................................................................................15 Mais informaes...............................................................................................................18 Respostas dos exerccios.................................................................................................19 testa-arquivos............................................................................................................19 relacao.sh..................................................................................................................19 zerador.sh ..................................................................................................................19 substring.sh...............................................................................................................20 juntatudo.sh...............................................................................................................20 users.sh.....................................................................................................................20 shells.sh .....................................................................................................................20 parametros.sh ............................................................................................................20
Sobre o curso
Nome Introduo a Shell Scripts Instrutor Aurlio Marinho Jargas (http://aurelio.net) Objetivo Ensinar aos alunos todos os conceitos necessrios para poderem fazer sozinhos scripts simples em shell. Pr-Requisitos Noes bsicas de informtica e operao do sistema pela linha de comando. desejado, porm no obrigatrio, noes bsicas de programao. Pblico Alvo Desenvolvedores, administradores de sistemas, programadores e interessados em geral. Durao 8 horas
Apresentao
O que o shell
O shell o "prompt" da linha de comando do Unix e Linux, o servo que recebe os comandos digitados pelo usurio e os executa. O shell aquele que aparece logo aps digitar-se a senha do usurio e entrar na tela preta. Ou na interface grfica, ao clicar no cone do Xterm, rxvt, Terminal ou Console.
localhost login: root Password: Last login: Fri Apr 16 01:57:28 on tty5 [root@localhost root]# _
Ali est o shell, esperando ansiosamente por algum comando para ele poder executar. Essa a sua funo: esperar e executar. Cada comando digitado lido, verificado, interpretado e enviado ao sistema operacional para ser de fato executado. No Mac OS X, o shell est em Aplicativos > Utilitrios > Terminal. No Windows preciso instal-lo com o Cygwin. Funcionando como uma ponte, o shell a ligao entre o usurio e o kernel. O kernel quem acessa os equipamentos (hardware) da mquina, como disco rgido, placa de vdeo e modem. Por exemplo, para o usurio ler um arquivo qualquer, toda esta hierarquia seguida: USURIO --> SHELL --> KERNEL --> DISCO RGIDO
Para os usurios do Windows, fcil pensar no shell como um MSDOS melhorado. Ao invs do C:\> aparece um [root@localhost root]#, mas o funcionamento similar. Basta digitar um comando, suas opes e apertar a ENTER que ele ser executado. O comando deve estar no PATH, mensagens de aviso so mandadas para a tela e Ctrl+C interrompe o funcionamento. Isso tudo igual em ambos. Mas o shell muito mais poderoso que seu primo distante. Alm dos comandos bsicos para navegar entre diretrios e manipular arquivos, ele tambm possui todas as estruturas de uma linguagem de programao, como IF, FOR, WHILE, variveis e funes. Com isso, tambm possvel usar o shell para fazer scripts e automatizar tarefas. Este ser o nosso foco: scripts em shell.
Shell script
Um script um arquivo que guarda vrios comandos e pode ser executado sempre que preciso. Os comandos de um script so exatamente os mesmos que se digita no prompt, tudo shell. Por exemplo, se de tempos em tempos voc quer saber informaes do sistema como horrio, ocupao do disco e os usurios que esto logados, preciso digitar trs comandos:
[root@localhost root]# date [root@localhost root]# df [root@localhost root]# w
melhor fazer um script chamado "sistema" e colocar estes comandos nele. O contedo do arquivo "sistema" seria o seguinte:
#!/bin/bash date df w
Isso um shell script. Um arquivo de texto que contm comandos do sistema e pode ser executado pelo usurio.
Antes de comear
Se voc est acessando o sistema como usurio administrador (root), saia e entre como um usurio normal. muito perigoso estudar shell usando o superusurio, voc pode danificar o sistema com um comando errado. Se voc no tem certeza qual o seu usurio, use o comando "whoami" para saber Como o prompt de usurio normal diferente para cada um, nos exemplos seguintes ser usado "prompt$" para indicar o prompt da linha de comando.
Use apenas letras minsculas e evite acentos, smbolos e espao em branco 2. Escolher o diretrio onde colocar o script Para que o script possa ser executado de qualquer parte do sistema, mova-o para um diretrio que esteja no seu PATH. Para ver quais so estes diretrios, use o comando:
echo $PATH
Se no tiver permisso de mover para um diretrio do PATH, deixe-o dentro de seu diretrio pessoal ($HOME). 3. Criar o arquivo e colocar nele os comandos Use o nano, VI ou outro editor de textos de sua preferncia para colocar todos os comandos dentro do arquivo. 4. Colocar a chamada do shell na primeira linha A primeira linha do script deve ser:
#!/bin/bash
Para que ao ser executado, o sistema saiba que o shell quem ir interpretar estes comandos. 5. Tornar o script um arquivo executvel Use o seguinte comando para que seu script seja reconhecido pelo sistema como um comando executvel:
chmod +x sistema
"Comando no encontrado"
O shell no encontrou o seu script. Verifique se o comando que voc est chamando tem exatamente o mesmo nome do seu script. Lembre-se que no Unix/Linux as letras maisculas e minsculas so diferentes, ento o comando "SISTEMA" diferente do comando "sistema". Caso o nome esteja correto, verifique se ele est no PATH do sistema. O comando "echo $PATH" mostra quais so os diretrios conhecidos, mova seu script para dentro de um deles, ou chame-o passando o caminho completo. Se o script estiver no diretrio corrente, chame-o com um "./" na frente, assim:
prompt$ ./sistema
"Permisso Negada"
O shell encontrou seu script, mas ele no executvel. Use o comando "chmod +x seu-script" para torn-lo um arquivo executvel.
"Erro de Sintaxe"
O shell encontrou e executou seu script, porm ele tem erros. Um script s executado quando sua sintaxe est 100% correta. Verifique os seus comandos, geralmente o erro algum IF ou aspas que foram abertos e no foram fechados. A prpria mensagem informa o nmero da linha onde o erro foi encontrado.
Para usar o echo, basta colocar o texto entre "aspas". Se nenhum texto for colocado, uma linha em branco mostrada.
O comando "read" leu o que o usurio digitou e guardou na varivel RESPOSTA. Logo em seguida, o comando "test" verificou se o contedo dessa varivel era "n". Se afirmativo, o
6
comando "exit" foi chamado e o script foi finalizado. Nessa linha h vrios detalhes importantes: O contedo da varivel acessado colocando-se um cifro "$" na frente O comando test til para fazer vrios tipos de verificaes em textos e arquivos O operador lgico "&&", s executa o segundo comando caso o primeiro tenha sido OK. O operador inverso o "||"
Basta iniciar a linha com um "#" e escrever o texto do comentrio em seguida. Estas linhas so ignoradas pelo shell durante a execuo. O cabealho com informaes sobre o script e seu autor tambm importante para ter-se uma viso geral do que o script faz, sem precisar decifrar seu cdigo. Tambm possvel colocar comentrios no meio da linha # como este
Rebobinando a fita
Agora hora de fixar alguns dos conceitos vistos no script anterior.
Variveis
As variveis so a base de qualquer script. dentro delas que os dados obtidos durante a execuo do script sero armazenados. Para definir uma varivel, basta usar o sinal de igual "=" e para ver seu valor, usa-se o "echo":
prompt$ prompt$ um dois prompt$ um dois prompt$ VARIAVEL="um dois tres" echo $VARIAVEL tres echo $VARIAVEL $VARIAVEL tres um dois tres
No podem haver espaos ao redor do igual "=" Ainda possvel armazenar a sada de um comando dentro de uma varivel. Ao invs de aspas, o comando deve ser colocado entre "$(...)", veja:
prompt$ prompt$ Hoje : prompt$ prompt$ prompt$ HOJE=$(date) echo "Hoje : $HOJE" Sb Abr 24 18:40:00 BRT 2004 unset HOJE echo $HOJE
E finalmente, o comando "unset" apaga uma varivel. Para ver quais as variveis que o shell j define por padro, use o comando "env"
O comando "cat" mostra o contedo de um arquivo. O comando "cat -n sistema" mostra o nosso script, com as linhas numeradas. O "-n" a opo para o comando, que o instrui a numerar linhas, e "sistema" o ltimo argumento, o nome do arquivo.
O "read" um comando do prprio shell, j o "date"" um executvel do sistema. Dentro de um script, no faz diferena usar um ou outro, pois o shell sabe como executar ambos. Assim, toda a gama de comandos disponveis no Unix/Linux pode ser usada em scripts! H vrios comandos que foram feitos para serem usados com o shell, so como ferramentas. Alguns deles: Comando cat cut date find grep head printf rev sed seq sort tail tr uniq wc Funo Mostra arquivo Extrai campo Mostra data Encontra arquivos Encontra texto Mostra Incio Mostra texto Inverte texto Edita texto Conta Nmeros Ordena texto Mostra Final Transforma texto -n, -s -d -f, -c -d, +'...' -name, -iname, -type f, -exec -i, -v, -r, -qs, -w -x -n, -c nenhuma nenhuma -n, s/isso/aquilo/, d -s, -f -n, -f, -r, -k -t, -o -n, -c, -f -d, -s, A-Z a-z Opes teis
Use "man comando" ou "comando --help" para obter mais informaes sobre cada um deles.
E o melhor, em shell possvel combinar comandos, aplicando-os em seqncia, para formar um comando completo. Usando o pipe "|" possvel canalizar a sada de um comando diretamente para a entrada de outro, fazendo uma cadeia de comandos. Exemplo:
prompt$ cat /etc/passwd | grep root | cut -c1-10 root:x:0:0 operator:x prompt$
O cat mostra o arquivo todo, o grep pega essa sada e extrai apenas as linhas que contm a palavra "root" e o cut por sua vez, somente nessas linhas que o grep achou, extrai os 10 primeiros caracteres. Isso funciona como uma estao de tratamento de gua, onde ela entra suja, vai passando por vrios filtros que vo tirando as impurezas e sai limpa no final. E por fim, tambm possvel redirecionar a sada de um comando para um arquivo ao invs da tela, usando o operador ">". Para guardar a sada do comando anterior no arquivo "saida", basta fazer:
prompt$ cat /etc/passwd | grep root | cut -c1-10 > saida prompt$ cat saida root:x:0:0 operator:x prompt$
O comando test
O canivete suo dos comandos do shell o "test", que consegue fazer vrios tipos de testes em nmeros, textos e arquivos. Ele possui vrias opes para indicar que tipo de teste ser feito, algumas delas: Testes em variveis -lt Nm. menor que (LessThan) -gt Nm. maior que (GreaterThan) -le Nm. menor igual (LessEqual) -ge Nm. maior igual (GreaterEqual) -eq Nm. igual (EQual) -ne Nm. diferente (NotEqual) = String igual Testes em arquivos -d um diretrio -f um arquivo normal -r O arquivo tem permisso de leitura -s O tamanho do arquivo maior que zero -w O arquivo tem permisso de escrita -nt O arquivo mais recente (NewerThan) -ot O arquivo mais antigo (OlderThan) -ef O arquivo o mesmo (EqualFile) -a E lgico (AND) -o OU lgico (OR)
10
11
O acesso direto, basta referenciar a varivel que o valor j estar definido. Assim possvel criar scripts que tenham opes como --help, --version e outras.
Expresses aritmticas
O shell tambm sabe fazer contas. A construo usada para indicar uma expresso aritmtica "$((...))", com dois parnteses.
prompt$ 6 prompt$ 8 prompt$ prompt$ 88 prompt$ prompt$ 45 echo $((2*3)) echo $((2*3-2/2+3)) NUM=44 echo $((NUM*2)) NUM=$((NUM+1)) echo $NUM
12
Diferente de outras linguagens, o if testa um comando e no uma condio. Porm como j conhecemos qual o comando do shell que testa condies, s us-lo em conjunto com o if. Por exemplo, para saber se uma varivel maior ou menor do que 10 e mostrar uma mensagem na tela informando:
if test "$VARIAVEL" -gt 10 then echo " maior que 10" else echo " menor que 10" fi
H um atalho para o test , que o comando [. Ambos so exatamente o mesmo comando, porm usar o [ deixa o if mais parecido com o formato tradicional de outras linguagens:
if [ "$VARIAVEL" -gt 10 ] then echo " maior que 10" else echo " menor que 10" fi
Se usar o [, tambm preciso fech-lo com o ], e sempre devem ter espaos ao redor. recomendado evitar esta sintaxe para diminuir suas chances de erro. J o while um lao que executado enquanto um comando retorna OK. Novamente o test bom de ser usado. Por exemplo, para segurar o processamento do script enquanto um arquivo de lock no removido:
while test -f /tmp/lock do echo "Script travado..." sleep 1 done
13
E por fim, o for percorre uma lista de palavras, pegando uma por vez:
for numero in um dois trs quatro cinco do echo "Contando: $numero" done
Uma ferramenta muito til para usar com o for o seq, que gera uma seqncia numrica. Para fazer o loop andar 10 passos, pode-se fazer:
for passo in $(seq 10)
14
Exerccios
A melhor parte finalmente chegou, agora a sua vez de se divertir. Seguem alguns exerccios que podem ser resolvidos usando o que foi aprendido at aqui. Alguns exigiro pesquisa e necessitaro de algumas ferramentas que foram apenas citadas, mas no aprendidas. O shelleiro tambm tem que aprender a se virar sozinho! Exerccio 1 - relacao.sh Recebe dois nmeros como parmetro e mostra a relao entre eles. Exemplo:
prompt$ ./relacao.sh 3 5 3 menor que 5 prompt$ ./relacao.sh 5 3 5 maior que 3 prompt$ ./relacao.sh 5 5 5 igual a 5 prompt$
Exerccio 2 - zerador.sh Recebe um nmero como parmetro e o diminui at chegar a zero, mostrando na tela cada passo, em uma mesma linha. Exemplo:
prompt$ ./zerador.sh 5 5 4 3 2 1 0 prompt$ ./zerador.sh 10 10 9 8 7 6 5 4 3 2 1 0 prompt$
Exerccio 3 - substring.sh Recebe duas palavras como parmetro e verifica se a primeira palavra est contida dentro da segunda. S mostra mensagem informativa em caso de sucesso, do contrrio no mostra nada. Exemplo:
prompt$ ./substring.sh ana banana ana est contida em banana prompt$ ./substring.sh banana maria prompt$ ./substring.sh banana prompt$ ./substring.sh prompt$
15
Exerccio 4 - juntatudo.sh Mostra na tela "grudados" todos os parmetros recebidos na linha de comando, como uma nica palavra. Exemplo:
prompt$ ./juntatudo.sh a b c d e f verde azul abcdefverdeazul prompt$
Pesquise sobre o comando tr Exerccio 5 - users.sh Do arquivo /etc/passwd, mostra o usurio e o nome completo de cada usurio do sistema (campos 1 e 5) separados por um TAB. Exemplo:
prompt$ ftp nobody named xfs mysql aurelio prompt$ ./users.sh FTP User Nobody Domain name server X Font Server MySQL server Aurelio Marinho Jargas
Pesquise sobre o comando cut Exerccio 6 - shells.sh Do arquivo /etc/passwd, mostra todos os shells (ltimo campo) que os usurios usam. No mostrar linhas repetidas. Exemplo:
prompt$ ./shells.sh /bin/bash /bin/false /bin/sync /sbin/halt /sbin/shutdown prompt$
16
Exerccio 7 - parametros.sh Mostra na tela todos os parmetros recebidos na linha de comando, contando-os. Exemplo:
prompt$ ./parametros.sh a b c d e f Parmetro 1: a Parmetro 2: b Parmetro 3: c Parmetro 4: d Parmetro 5: e Parmetro 6: f prompt$
17
Mais informaes
Livro Programao Shell Linux Autoria de Julio Cezar Neves, Editora Brasport, ISBN 85-7452-118-3 Livro BASH - Guia de Consulta Rpida Autoria de Joel Saade, Editora Novatec, ISBN 85-7522-006-3 Lista de discusso nacional sobre Shell Script http://br.groups.yahoo.com/group/shell-script Pgina do instrutor sobre Shell Script, com links para vrios outros materiais http://aurelio.net/shell
18
testa-arquivos
#!/bin/bash echo -n "Digite o arquivo: " read ARQUIVO test -d "$ARQUIVO" && echo "$ARQUIVO um diretrio" test -f "$ARQUIVO" && echo "$ARQUIVO um arquivo" test -f "$ARQUIVO" -o -d "$ARQUIVO" || echo "O arquivo '$ARQUIVO' no foi encontrado" echo
relacao.sh
#!/bin/bash if test $1 -eq $2 then echo "$1 igual a $2" elif test $1 -lt $2 then echo "$1 menor que $2" else echo "$1 maior que $2" fi
zerador.sh
#!/bin/bash i=$1 while test $i -ge 0 do echo -n "$i " i=$((i-1)) done echo
19
substring.sh
#!/bin/bash test $# -ne 2 && exit echo $2 | grep -qs $1 && echo "$1 est contida em $2"
juntatudo.sh
#!/bin/bash echo $* | tr -d ' '
users.sh
#!/bin/bash cat /etc/passwd | cut -d : -f 1,5 | tr : '\t'
shells.sh
#!/bin/bash cat /etc/passwd | cut -d : -f 7 | sort | uniq
parametros.sh
#!/bin/bash i=0 while test "$1" do i=$((i+1)) echo "Parmetro $i: $1" shift done
20