Você está na página 1de 22

Introduo ao Shell Script

Aurlio Marinho Jargas


http://aurelio.net

Abril de 2004
Introduo ao Shell Script Aurlio Marinho Jargas

ndice
Sobre o Curso.......................................................................................................................1

Apresentao........................................................................................................................2
O Que o Shell...........................................................................................................2
Shell Script...................................................................................................................2
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 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


testaarquivos...........................................................................................................19
relacao.sh..................................................................................................................19
zerador.sh..................................................................................................................19
substring.sh...............................................................................................................19
juntatudo.sh...............................................................................................................19
users.sh.....................................................................................................................20
shells.sh.....................................................................................................................20
parametros.sh............................................................................................................20

i
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.
PrRequisitos
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

1
Apresentao
O Que o Shell
O Shell o "prompt" da linha de comando do Linux, o servo que recebe os comandos
digitados pelo usurio e os executa.

O Shell aquele que aparece logo aps se digitar a senha do usurio e entrar na tela preta
do Linux. Ou na interface grfica, ao clicar no cone do Xterm ou do rxvt.

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, checado,
interpretado e enviado ao Sistema Operacional para ser de fato executado.

Funcionando como uma ponte, o Shell a ligao entre o usurio e o kernel. O kernel
quem acessa o hardware da mquina, como disco rgido, placa de vdeo e modem. Por
exemplo, para o usurio acessar 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 o foco do curso: 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.

2
Introduo ao Shell Script Aurlio Marinho Jargas

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

E para chamar este script, basta agora executar apenas um comando:

[root@localhost root]# sistema

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.

3
O Primeiro Shell Script
O primeiro Shell Script a fazer ser o "sistema" do exemplo anterior, de simplesmente
juntar trs comandos num mesmo script.

Passos Para Criar um Shell Script


1. Escolher um nome para o script

J temos um nome: sistema.

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, movao 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, deixeo dentro de


seu HOME

3. Criar o arquivo e colocar nele os comandos

Use o 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

4
Introduo ao Shell Script Aurlio Marinho Jargas

Problemas na Execuo do Script

"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. Lembrese que no 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 chameo passando o caminho completo.

Se o script estiver no diretrio corrente, chameo com um "./" na frente, assim:

prompt$ ./sistema

Caso contrrio, especifique o caminho completo desde o diretrio raiz:

prompt$ /tmp/scripts/sistema

"Permisso Negada"

O Shell encontrou seu script, mas ele no executvel.

Use o comando "chmod +x seuscript" para tornlo 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.

5
O Primeiro Shell Script Melhorado
Nesse ponto, voc j sabe o bsico necessrio para fazer um script em Shell do zero e
executlo. Mas apenas colocar os comandos num arquivo no torna este script til.
Vamos fazer algumas melhorias nele para que fique mais compreensvel.

Melhorar a Sada na Tela


Executar os trs comandos seguidos resulta num bolo de texto na tela, misturando as
informaes e dificultando o entendimento. preciso trabalhar um pouco a sada do script,
tornandoa mais legvel.

O comando "echo" serve para mostrar mensagens na tela. Que tal anunciar cada
comando antes de executlo?

#!/bin/bash
echo "Data e Horrio:"
date
echo
echo "Uso do disco:"
df
echo
echo "Usurios conectados:"
w

Para usar o echo, basta colocar o texto entre "aspas". Se nenhum texto for colocado, uma
linha em branco mostrada.

Interagir com o Usurio


Para o script ficar mais completo, vamos colocar uma interao mnima com o usurio,
pedindo uma confirmao antes de executar os comandos.

#!/bin/bash
echo "Vou buscar os dados do sistema. Posso continuar? [sn] "
read RESPOSTA
test "$RESPOSTA" = "n" && exit
echo "Data e Horrio:"
date
echo
echo "Uso do disco:"
df
echo
echo "Usurios conectados:"
w

O comando "read" leu o que o usurio digitou e guardou na varivel RESPOSTA. Logo
em seguida, o comando "test" checou se o contedo dessa varivel era "n". Se

6
Introduo ao Shell Script Aurlio Marinho Jargas

afirmativo, o comando "exit" foi chamado e o script foi finalizado. Nessa linha h vrios
detalhes importantes:

O contedo da varivel acessado colocandose um cifro "$" na frente


O comando test muito til para fazer vrios tipos de checagens em textos e
arquivos
O operador lgico "&&", s executa o segundo comando caso o primeiro tenha sido
OK. O operador inverso o "||"

Melhorar o Cdigo do Script


Com o tempo, o script vai crescer, mais comandos vo ser adicionados e quanto maior,
mais difcil encontrar o ponto certo onde fazer a alterao ou corrigir algum erro.

Para poupar horas de estresse, e facilitar as manutenes futuras, preciso deixar o


cdigo visualmente mais agradvel e espaado, e colocar comentrios esclarecedores.

#!/bin/bash
# sistema script que mostra informaes sobre o sistema
# Autor: Fulano da Silva

# Pede uma confirmao do usurio antes de executar


echo "Vou buscar os dados do sistema. Posso continuar? [sn] "
read RESPOSTA

# Se ele digitou 'n', vamos interromper o script


test "$RESPOSTA" = "n" && exit

# O date mostra a data e a hora correntes


echo "Data e Horrio:"
date
echo

# O df mostra as parties e quanto cada uma ocupa no disco


echo "Uso do disco:"
df
echo

# O w mostra os usurios que esto conectados nesta mquina


echo "Usurios conectados:"
w

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 se ter uma viso geral do que o script faz, sem
precisar decifrar seu cdigo.

Tambm possvel colocar comentrios no meio da linha # como este

7
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, usase o "echo":

prompt$ VARIAVEL="um dois tres"


prompt$ echo $VARIAVEL
um dois tres
prompt$ echo $VARIAVEL $VARIAVEL
um dois tres um dois tres
prompt$

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$ HOJE=$(date)
prompt$ echo "Hoje : $HOJE"
Hoje : Sb Abr 24 18:40:00 BRT 2004
prompt$ unset HOJE
prompt$ echo $HOJE

prompt$

E finalmente, o comando "unset" apaga uma varivel.

Para ver quais as variveis que o Shell j define por padro, use o comando
"env"

Detalhes Sobre os Comandos


Diferente de outras linguagens de programao, o Shell no usa os parnteses para
separar o comando de seus argumentos, mas sim o espao em branco. O formato de um
comando sempre:

COMANDO OPES PARMETROS

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

8
Introduo ao Shell Script Aurlio Marinho Jargas

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 Linux pode ser usada em scripts!
Inclusive programas grandes como Gimp, Mozilla e outros.

H vrios comandos que foram feitos para serem usados com o Shell, so como
ferramentas. Alguns deles:

Comando Funo Opes teis


cat Mostra arquivo n, s
cut Extrai campo d f, c
date Mostra data d, +'...'
find Encontra arquivos name, iname, type f, exec
grep Encontra texto i, v, r, qs, w x
head Mostra Incio n, c
printf Mostra texto nenhuma
rev Inverte texto nenhuma
sed Edita texto n, s/isso/aquilo/, d
seq Conta Nmeros s, f
sort Ordena texto n, f, r, k t, o
tail Mostra Final n, c, f
tr Transforma texto d, s, AZ az
uniq Remove duplicatas i, d, u
wc Conta Letras c, w, l, L

Use "man comando" ou "comando help" para obter mais informaes sobre
cada um deles.

E o melhor, em Shell possvel combinar comandos, aplicandoos 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 c110


root:x:0:0
operator:x
prompt$

9
Introduo ao Shell Script Aurlio Marinho Jargas

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 c110 > saida


prompt$ cat saida
root:x:0:0
operator:x
prompt$

Cuidado! Shell to legal que vicia!

O comando test
O canivete suo dos comandos do Shell o "test", que consegue fazer vrios tipos de
checagens, em nmeros, textos e arquivos. Ele possui vrias opes para indicar que tipo
de teste ser feito, algumas delas:

Testes em variveis Testes em arquivos


lt Nm. menor que (LessThan) d um diretrio
gt Nm. maior que (GreaterThan) f um arquivo normal
le Nm. menor igual (LessEqual) r arquivo tem permisso de leitura
ge Nm. maior igual (GreaterEqual) s o tamanho do arquivo maior que zero
eq Nm. igual (EQual) w o arquivo tem permisso de escrita
ne Nm. diferente (NotEqual) nt o arquivo mais recente (NewerThan)
= String igual ot o arquivo mais antigo (OlderThan)
!= String diferente ef o arquivo o mesmo (EqualFile)
n String no nula a E lgico (AND)
z String nula o OU lgico (OR)

10
Introduo ao Shell Script Aurlio Marinho Jargas

TAREFA: Script que testa arquivos


Fazer o script "testaarquivos", que pede ao usurio para digitar um arquivo e testa se
este arquivo existe. Se sim, diz se um arquivo ou um diretrio. Exemplo de uso:

prompt$ testaarquivos
Digite o arquivo: /naoexiste
O arquivo '/naoexiste' no foi encontrado

prompt$ testaarquivos
Digite o arquivo: /tmp
/tmp um diretrio

prompt$ testaarquivos
Digite o arquivo: /etc/passwd
/etc/passwd um arquivo

prompt$

11
Conceitos Avanados
At agora vimos o bsico, o necessrio para se fazer um script de funcionalidade mnima.
A seguir, conceitos novos que ampliaro as fronteiras de seus scripts!

Recebimento de opes e parmetros


Assim como os comandos do sistema que possuem e opes e parmetros, os scripts
tambm podem ser preparados para receber dados via linha de comando.

Dentro do script, algumas variveis especiais so definidas automaticamente, em especial,


"$1" contm o primeiro argumento recebido na linha de comando, "$2" o segundo, e assim
por diante. Veja o script "argumentos":

#!/bin/sh
# argumentos mostra o valor das variveis especiais

echo "O nome deste script : $0"


echo "Recebidos $# argumentos: $*"
echo "O primeiro argumento recebido foi: $1"
echo "O segundo argumento recebido foi: $2"

Ele serve para demonstrar o contedo de algumas variveis especiais, acompanhe:

prompt$ ./argumentos um dois trs


O nome deste script : ./argumentos
Recebidos 3 argumentos: um dois trs
O primeiro argumento recebido foi: um
O segundo argumento recebido foi: dois

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$ echo $((2*3))


6
prompt$ echo $((2*32/2+3))
8
prompt$ NUM=44
prompt$ echo $((NUM*2))
88
prompt$ NUM=$((NUM+1))
prompt$ echo $NUM
45

12
Introduo ao Shell Script Aurlio Marinho Jargas

If, For e While


Assim como qualquer outra linguagem de programao, o Shell tambm tem estruturas
para se fazer condicionais e loop. As mais usadas so if, for e while.

if COMANDO for VAR in LISTA while COMANDO


then do do
comandos comandos comandos
else done done
comandos
fi

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 uslo 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 fechlo com o ], e sempre devem ter espaos


ao redor.

J o while um lao que executado enquanto um comando retorna OK. Novamente o


test (ou o [) 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
sleep 1
done

13
Introduo ao Shell Script Aurlio Marinho Jargas

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, podese fazer:

for passo in $(seq 10)

O mesmo pode ser feito com o while, usando um contador:

i=0
while test i le 10
do
i=$((i+1))
echo "Contando: $i"
done

E temos ainda o loop infinito, com condicional de sada usando o "break:

while :
do
if test f /tmp/lock
then
echo "Aguardando liberao do lock..."
sleep 1
else
break
fi
done

14
Exerccios
A melhor parte do curso finalmente chegou, agora a sua vez de se divertir. Seguem
alguns exerccios que podem ser resolvidos usando o que foi aprendido no curso.

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 5
prompt$ ./relacao.sh 5 3
5 maior 3
prompt$ ./relacao.sh 5 5
5 igual 5

Exerccio 2 zerador.sh

Recebe um nmero como parmetro e o diminui at chegar a zero, mostrando na


tela cada passo, numa 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

Exerccio 3 substring.sh

Recebe duas palavras como parmetro e checa 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$

Pesquise sobre o comando


grep

15
Introduo ao Shell Script Aurlio Marinho Jargas

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

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$ ./users.sh
ftp FTP User
nobody Nobody
named Domain name server
xfs X Font Server
mysql MySQL server
aurelio 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

Pesquise sobre o comando


uniq

16
Introduo ao Shell Script Aurlio Marinho Jargas

Exerccio 7 parametros.sh

Mostra na tela todos os parmetros recebidos na linha de comando, contandoos.


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

Pesquise sobre o comando shift

17
Mais Informaes
Livro Programao Shell Linux, 3 Edio
Autoria de Julio Cezar Neves, Editora Brasport, ISBN 8574521183

Livro BASH Guia de Consulta Rpida


Autoria de Joel Saade, Editora Novatec, ISBN 8575220063

Lista de discusso nacional sobre Shell Script


http://br.groups.yahoo.com/group/shellscript

Pgina do instrutor sobre Shell Script, com links para vrios outros materiais
http://aurelio.net/shell

18
Respostas dos Exerccios
testaarquivos
#!/bin/bash

echo n "Digite o arquivo: "; read ARQUIVO


[ d "$ARQUIVO" ] && echo "$ARQUIVO um diretrio"
[ f "$ARQUIVO" ] && echo "$ARQUIVO um arquivo"
[ f "$ARQUIVO" o d "$ARQUIVO" ] ||
echo "O arquivo '$ARQUIVO' no foi encontrado"
echo

relacao.sh
#!/bin/sh

if [ $1 eq $2 ]; then
echo "$1 igual $2"
elif [ $1 lt $2 ]; then
echo "$1 menor $2"
else
echo "$1 maior $2"
fi

zerador.sh
#!/bin/bash

i=$1
while [ $i ge 0 ]; do
echo n "$i "
i=$((i1))
done
echo

substring.sh
#!/bin/sh

[ $# ne 2 ] && exit
echo $2 | grep qs $1 && echo "$1 est contida em $2"

juntatudo.sh
#!/bin/sh

echo $* | tr d ' '

19
Introduo ao Shell Script Aurlio Marinho Jargas

users.sh
#!/bin/sh

cat /etc/passwd | cut d : f 1,5 | tr : '\t'

shells.sh
#!/bin/sh
cat /etc/passwd | cut d : f 7 | sort | uniq

parametros.sh
#!/bin/bash

i=0
while [ "$1" ] ; do
i=$((i+1))
echo "Parmetro $i: $1"
shift
done

20

Você também pode gostar