Sie sind auf Seite 1von 14

www.howtoday.com.

br
SHELL SCRIPT
A linguagem de programao Shell um kit de ferramentas versteis e
de grande utilidade para o administrador, pois esta linguagem utiliza como
interpretador de comando o prprio Shell do sistema e, sendo assim, pode
executar todos os comandos de um terminal do Linux ou do Unix e ainda mais
as suas prprias estruturas de anlises lgicas, seus comandos prprios,
interfaces grficas, etc. Estas caractersticas todas fazem de um programa de
Shell uma parte integrante do prprio sistema em si, uma vez que diversas
rotinas administrativas podem ser interfaceadas por ele, como backups, regras
de firewall, criao e administrao de usurios em demanda, etc. Enfim, o
Shell Script totalmente aplicvel a sistema.
Antes de produzir o primeiro script, algumas ferramentas devem ser
conhecidas:
Aliases
Os aliases substituem comandos ou parte de linhas de comandos. Eles
so armazenados em memria e removidos dela no momento em que o
usurio no est mais usando o terminal (logoff), por causa disto, para que
haja persistncia dos aliases, preciso declar-los em algum arquivo de script
de login de usurio, como foi visto em captulo anterior.
A sintaxe de criao de um alias esta abaixo:
#alias <nome do alias>=comandos
Para remover um alias:
#unalias <nome do alias>
Para executar o alias, basta digitar o nome dele como um comando, que
pode, sem problemas ter argumentos tambm:
#<nome do alias>
Exemplos:
Criando e executando o alias backup para fazer backup de todo o
diretrio /var/log para um aquivo chamado /backups/backup-var.tar.gz:

#alias backup=tar -czvf /backups/backup-var.tar.gz /var/log


#backup

www.howtoday.com.br
Criando um alias para tornar padro o modo interativo do comando rm
quando ele for digitado:
#alias rm=rm i
Neste caso, quando o comando for executado com qualquer que seja a
opo, ser perguntado ao usurio se ele quer mesmo excluir o objeto.
Funes
Ao contrrio dos aliases, as funes s conseguem armazenar comandos
completos, ou seja: no aceitam argumentos na hora da execuo.
As duas sintaxes possveis para uma funo so:
#function <nome> { comandos; };
ou
#<nome> () { comandos; };
preciso tomar muito cuidado com os espaos entre as chaves e os
outros caracteres, pois se esta sintaxe no for mantida risca, a funo no
funcionar.
Exemplos:
Criando e executando uma funo para atualizar a base de dados do APT,
instalar o pacote squid e depos limpar o cache:
#function instala_squid { apt-get update; apt-get install squid;
apt-get clean; };
#instala_squid
Para excluir uma funo, basta usar o comando unset:
#unset <funo>
Para exibir todas as funes criadas:
#declare f
Variveis do Shell
O Shell do sistema trabalha o tempo inteiro lendo e gravando variveis
que vo ajud-lo a interpretar melhor os comandos e as configuraes
existentes. Um exemplo sismples a varivel HOME do usurio, que lida pela
linha de comando cd ~ para que seja possvel entender que ~ o homedir
do usurio em sesso, a cada vez que um usurio faz logon criada esta
varivel com o caminho do diretrio pessoal dele (independente de qual seja
este usurio).Existem dois tipos de variveis no Linux:
Variveis Globais
So as variveis que no dependem de sesso de usurio para existirem.
Estas variveis podem ser consultadas atravs do comando set.
Exemplos:
LANG : varivel que recebe o idioma do sistema e a codificao de
caracteres.
LANGUAGE: varivel de idiomas de teclado.
HOSTNAME : hostname da mquina.

www.howtoday.com.br
Variveis de ambiente
So aquelas que dependem do usurio para serem criadas, pois,
dependendo de quem seja o usurio, a varivel no ser a mesma, como as
variveis abaixo:
PATH : indica o caminho de busca dos comandos que so digitados pelo
usurio. A varivel PATH do usurio root contm os diretrios sbin, que a
mesma varivel para um usurio comum no tem, por padro, pois os
programas contidos em dietrios sbin so de uso exclusivo de root.
SHELL : aponta para a localizao do arquivo binrio do Shell do usurio.
PWD : diretrio atual do usurio.
OLDPWD : diretrio acessado anteriormente pelo usurio.
HOME : diretrio pessoal do usurio.
A lista de variveis de ambiente pode ser obtida com o comando env.
Criao e manipulao de variveis
Dependendo do motivo do script, o usurio vai precisar que a varivel
que ele esteja usando no sirva apenas para o seu prprio programa, mas seja
tambm uma varivel exportada para o sistema, ento, a primeira providncia
que deve ser tomada exportar esta varivel com o comando abaixo:
#export <varivel>=<valor>
Este processo tambm pode ser feito em duas etapas: a criao e depois
a exportao da varivel. Para isso, podemos usar as seguintes linhas de
comando:
#<varivel>=<valor>
#export <varivel>
Toda vez que uma varivel for utilizada, o $ deve vir antes do nome dela,
como no exemplo abaixo:
#export LOGS=/var/log
#cd $LOGS
Outro exemplo de manipulao de varivel a adio do diretrio
/programas na varivel PATH do usurio para que comandos que estejam neste
diretrio possam ser executados de forma mais simples por ele:
#export PATH=$PATH:/programas
Mostrando o valor da varivel:
#echo $PATH
Para excluir uma varivel que foi criada, basta utilizar tambm o
comando unset, como no exemplo abaixo:
#unset LOGS
Criao de scripts
Um aquivo de script um arquivo comum de texto e pode ser executado
com qualquer extenso (.txt,.mp3,.ppt, etc..), at porque as extenses em
Linux no tm funcionalidade nenhuma para execuo ou leitura ou gravao
em arquivos. Ainda que no utilizemos as extenses, para que o script de Shell
possa ser lido pelo edito vim com cores de sintaxe preciso que o arquivo de
script tenha alguma extenso, mais especificamente a extenso .sh.

www.howtoday.com.br
Como os scripts de Shell sero utilizados em administrao de sistema
Linux como caixa de ferramentas, vamos j comear aplicando o seu uso para
este fim, com o primeiro script abaixo, que ser um programa para criar
usurios:
#vim ~/cria_users.sh

Neste script, j se podem notar algumas caractersticas de Shell Script,


como a insero de comentrios, que pode ser feita com o #. Eles so
primordiais para a boa documentao dos scripts criados, pois podem ser
usados para marcar a verso do script, as datas de criao e ltima
modificao, o autor e a descrio do script que est sendo criado, como foi
feito no exemplo acima.
importante tambm que a informao de qual Shell vai interpretar os
comandos esteja no cabealho com a seguinte sintaxe: #!<caminho do
Shell>. No exemplo acima foi utilizado o Shell BASH, cujo binrio est em
/bin/bash. Poderia ter sido utilizado outro Shell disponvel em /etc/shells, sem
nenhum problema, mas como o BASH o Shell padro para comandos no
Linux, sempre melhor utiliz-lo como interpretador para os comandos que
vo ser usados.
Alguns outros recursos usados acima sero analisados agora:
#echo
Este comando responsvel por produzir tanto STDIN (sada padro de
comando) como STDERR (sada de erros de comando). Suas sintaxes so:
#echo <valor de varivel, sada de comando ou texto>
#echo <valor de varivel, sada de comando ou texto>

www.howtoday.com.br

#echo <texto>
Exemplos:
Produzindo como sada o valor da varivel SHELL:
#echo $SHELL
ou
#echo $SHELL
Produzindo o texto $SHELL:
#echo $SHELL
Outro detalhe importante sobre o comando echo so as opes de
posicionamento do texto, utilizadas em conjunto com o parmetro -e do
mesmo:
\\n : insere nova linha.
\\t : insere tabulao horizontal (padro para documentos de texto em
geral).
\\v : insere tabulao vertical.
\\b : insere um backspace.
\\a : emite um sinal de bip do speaker.
Exemplos:
Exibir o texto de seguinte forma:
How
To
LPI
#echo -e How \\nTo \\nLPI
Exibir o mesmo texto, s que com as linhas tabuladas horizontalmente:
#echo -e \\tHow \\n\\tTo\\n\\tLPI

www.howtoday.com.br
Agora, o mesmo tabulado horizontalmente e verticalmente
(espeamento entre linhas):
#echo -e \\v\\tHow \\n\\v\\tTo \\n\\v\\tLPI
#read
Atribui a uma varivel o valor digitado pelo usurio.
Exemplos:
Lendo o valor da varivel IP, que ser lanado como 172.16.0.1 pelo
usurio, e exportando a varivel:
#read IP; export IP
Lendo, exportando e exibindo o valor da varivel DSK_BKP com
mensagem para o usurio:
#read -p Digite o disco desejado para backup: DSK_BKP
#export DSK_BKP
#echo $DSK_BKP
lgico que o uso do read s vivel para um script, pois a nica
forma de pedir para que o usurio lance um valor para uma varivel.
Sub-Shells
Quando a sada desejada para STDOUT, STDIN ou STDERR o resultado
de um comando, o ideal utilizar um Sub-Shell, que uma forma de um
comando utilizar a sada de um outro comando ou de uma varivel receber um
resultado de comando. Um Sub-Shell pode ser representado por $(comando)
ou por `comando`, como nos exemplos abaixo:
Fazendo backup de uma lista em um arquivo chaamado lista.txt:
#tar -cjvf /backups/bkp-lista.tar.bz2 `cat lista.txt`
Execuo de um script
importante que um script tenha permisso de execuo para o usurio
que o quer utilizar, pois desta forma, ele pode ser executado se for informado o
seu caminho completo ou se ele for copiado (ou se tiver um link) para um
diretrio do path do usurio s execut-lo como um comando qualquer,
apenas digitando o seu nome.
Outras formas de execuo:
#sh <script> (neste caso, o script no precisa ter permisso de
execuo).
#. <script>
#./<script>
#source <script>
#bash <script>

www.howtoday.com.br
Exemplos:
Executando o script cria_users.sh criado acima como um comando no
path do usurio:

#chmod +x ~/cria_users.sh && ln -s /root/cria_uses.sh


/sbin/cria_users
#cria_users
Executando ~/cria_users.sh, que no est no path do usurio:
#sh ~/cria_users.sh
Estruturas de anlise lgica
As estruturas funcionam no Shell Script como na maioria das linguagens
de programao, s que com sintaxes diferentes. sempre recomendvel para
um programador Shell conhea pelo menos um pouco de algoritmos (o mximo
possvel), pois preciso antes de implementar uma estrutura dessas, saber
muito bem qual ser o intuito, uma anlise condicional, uma execuo com n
passos, uma estrutura de repetio ou uma anlise de caso para um menu, por
exemplo.
O uso de cada uma dessas estruturas bem didtico e bem simples,
mesmo para o administrador de sistema Linux que nunca teve contato com
lgica de programao.
Antes de conhecer cada uma das estruturas, importante conhecer o
comando abaixo:
test
Testa arquivos, diretrios, nmeros e strings (textos).
Testes numricos:
-eq : igual a.
-lt : menor que.
-le : menor ou igual.
-gt : maior que.

www.howtoday.com.br
-ge : maior ou igual.
-ne : diferente de.
Testes em strings:
= : igual a.
!= : diferente de.
-z : vazia.
-n : no-vazia.
Testes em aquivos:
-d : um diretrio.
-f : um arquivo.
-s : um aquivo e no vazio.
-ef : o mesmo arquivo.
-nt : arquivo mais novo.
-ot : arquivo mais velho.
Estrutura if (condicional)
Analisa uma condio verdadeira e, para ela, executa uma srie de
comandos. Tambm possvel adicionar uma condio para se teste for falso
(else), mas esta no imprescindvel.
Sintaxe1:
if <condio verdadeira>
then <comandos>
fi
Onde fi finaliza a estrutura.
Sintaxe2:
if <condio verdadeira>
then <comandos>
else <comandos>
fi
Sintaxe3:
if <condio verdadeira>
then <comandos>
else if <condio verdadeira>
then <comandos>
fi
fi
No modelo de sintaxe acima, temos uma estrutura if composta, onde a
anlise de condio falsa (else) pode receber uma outra estrutura if. Outro
detalhe que, como foram utilizadas 2 estruturas if, foram tambm finalizadas
as duas com fi.
Exemplo1:

www.howtoday.com.br

No caso acima, o script acim testa a existncia do arquivo /etc/nologin.


Caso este exista, a mensagem O login no ser possvel agora!! ser exibida,
caso contrrio, a mensagem Login liberado ser exibida.

Exemplo2:

No caso acima, mais uma condio foi analisada: a de existir /etc/nologin,


mas ele ser um diretrio, e no um arquivo, neste caso, a mensagem
/etc/nologin um diretrio, no um arquivo ser exibida.
Para estruturas if compostas com muitas condies, utilizada a
avaliao booleana ( E e OU). Em um exemplo abaixo, podemos testar a
existncia de /etc/network/interfaces e se este arquivo est vazio ou no antes
de configurar a rede via script:
#!/bin/bash
configura () {
read -p Qual a sua sala? sala
read -p Qual a sua mquina? maq
echo -e
auto lo

www.howtoday.com.br
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.$sala.1.$maq
netmask 255.255.255.0
gateway 10.$sala.1.254 > /etc/network/interfaces ;;
}
###A avaliao booleana ocorre abaixo, onde somente se o
arquivo de configurao das interfaces de rede existir e no for vazio,
os comandos sero executados:
if test -f /etc/network/interfaces && test -s /etc/network/interfaces
then
echo Existe um arquivo com este nome. Deseja sobrescrev-lo(sim ou
no)?
read resp
function avalia {
case $resp in
sim|s|yes|y)
configura
no|nao|n|no)
exit 0 ;;
*)
read -p Por favor, responda sim ou no. Pressione ENTER para voltar
pergunta
avalia
esac
}
avalia
else
configura
fi
#########FIM DO SCRIPT#############
Para avaliao booleana, podem ser utilizados em conjunto com o
comando test:
&& : apenas se todas as condies forem satisfeitas que os comandos
so executados.
|| : neste caso, basta que alguma das opes esteja correta para que os
comados sejam executados.
Estruturas while e until
Estras estruturas tm sintaxes diferentes, porm tm a mesma funo: a
de executar tarefas em repetio (loop) mediante a um teste satisfeito.
Estrutura while:
while <teste verdadeiro>
do <comandos>
done
Estrutura until:

www.howtoday.com.br

until <teste falso>


do <comandos>
done
No caso de uma estrutura while, sero repetidos comandos enquanto
aquele teste for verdadeiro, enquanto que na estrutura until justamente o
contrrio: apenas quando o teste falso for satisfeito a repetio dos comandos
vai parar de ser realizada.
Exemplos:
No caso
acima, foi criado
um loop de
criao de
diretrios onde,
cada vez que este
loop for
executado, ele vai
verificar se a
varivel qtd
(quantidade de
diretrios) ainda
maior que cont (um contador que foi criado para servir de referncia), caso
seja, cont vai ter o seu valor acrescido de 1 e vai servir de rtulo para a
criao de um diretrio com o nome dir-$cont, quando cont for igual qtd, o
loop acaba.
Neste script foram utilizados operadores matemticos. Os operadores
para Shell Script so:
+ : soma
- : subtrao.
* : multiplicao.
/ : diviso.
** : exponenciao.
Para o caso de precisar fazer alguma operao aritmtica, ela deve ser
deve ser realizada entre (( )) ou $(( )), como foi mostrado no exemplos
acima.

www.howtoday.com.br
Neste caso acima, foi utilizada a estrutura de repetio until, que testou
o valor da varivel qtd at que ele fosse igual ao valor da varivel cont, que,
na verdade, agiu como uma constante neste script, j que o seu valor apenas
serviu como parmetro de comparao para a varivel qtd, que permaneceu
sendo subtrada de 1 a cada loop desses.
Estrutura for
A estrutura for atribui para uma varivel um valor de uma lista por vez.
Para cada passo dessa lista sero executados comandos que estiverem abaixo
de do. Esta uma ferramenta importantssima para programas que
precisam executar passos em sequncia.
Sintaxe:
for <varivel> in <lista>
do
<comandos>
done

Exemplo:

No programa acima, para cada diretrio da lista extrada do arquivo


/etc/passwd foi criado um arquivo de backup. Supondo que haja 20 usurios
nesta lista, os comandos sero executados 20 vezes, portanto teremos 20
arquivos de backup, um para cada homedir de usurio, pois a cada passo
desses, a varivel home receber um desses diretrios como valor.
O uso de for em scripts til tambm para criao de diretrios em
demanda, utilizando o comando seq.
#seq
Exibe uma sequncia numrica.
Exemplos:
Exibir de 1 at 100:
#seq 100
Exibir de 10 at 100:
#seq 10 100
Exibir de 10 at 100 com intervalo de 5:

www.howtoday.com.br
#seq 10 5 100
Exemplo de uso do seq na estrutura for:
#vim ~/criadir_for.sh

Toda vez que digitado um parmetro para qualquer comando, este parmetro
guardado na varivel 1, por isso ela foi analisada sem ser solicitada pelo
comando read.
No programa acima, a varivel num, utilizada pela estrutura for, recebe
cada um desses nmeros que foram resultado do comando seq de cada vez e,
para cada um deles, cria um diretrio. Detalhe: tudo foi feito com apenas 4
linhas de script.
Vamos execuo do script (que vai criar 10 diretrios):
#chmod +x ~/criadir_for.sh
#ln -s ~/criadir_for.sh /sbin/criadir_for
#criadir_for 10
Estrutura case
Analisa se a varivel se encontra em cada caso e, para cada um, executa
os comandos escolhidos pelo programador. Esta estrutura muito til na
criao de programas com menu e tambm na criao de comandos que
possuem argumentos.
Sintaxe:
case <varivel> in
<opo1>) <comandos> ;;
<opo2>) <comandos> ;;
<opo3>) <comandos>
esac
Em tese, este estrutura uma ferramenta de substituio estrutura if
em anlises muito grandes, como uma que precisasse de 10 condies, com o
if este cdigo ficaria enorme e, em qualquer linguagem de programao,
primordial que o programador prime pela boa organizao de seu scripts,
estruturas cada vez menores mas que tenham funcionalidade completa.
Existe a necessidade de o programador providenciar que o script dele esteja
bem documentado (com comentrios e, se necessrio, manuais), bem
indentado e com as verses bem atualizadas, levando em considerao a
freqncia com que elas so atualizadas para decidir se ser uma verso com
2,3 ou at 4 dgitos.
Voltando estrutura, cada opo do case deve ser separada da outra
com ;; e o final da mesma marcado pelo esac.
O tratamento de erros em uma estrutura case feito por * em uma das
opes significando nenhuma das alternativas acima.

www.howtoday.com.br
Vamos ver um exemplo de case usado para analisar um menu de
opes em um programa para gerenciamento de pacotes:
A funo menu, no caso deste script responde pelo menu e pela
estrutura case inteira e, antes de ela ser executada, o sinal 2(sinal INT) foi
capturado com o comando trap. Este comando insensibiliza uma linha de
comandos a sinais em especfico, neste caso a funo no ter como ser
interrompida com CTRL+C.
Quanto s opes, o | quer dizer ou, para o caso de o nmero ser
digitado por extenso.
O uso do shift
Quando o usurio digita vrios argumentos de um comando aps o
mesmo, a mesma varivel 1 tem que receber vrias opes, uma de cada vez,
para que as opes do comando sejam processadas corretamente. Pois ento,
o comando shift faz a funo de fazer com que um valor atribudo varivel
seja processado aps o anterior j ter sido, fazendo com que a varivel sempre
receba valores em sequncia.

A execuo deste programa vai acarretar no backup de todos os


diretrios dos usurios que forem digitados como argumentos do comando
bkpusr (nome do porgrama), como no exemplo do backup dos diretrios
pessoais dos usurios user1, operador e dba:
#bkpusr user1 operador dba

Das könnte Ihnen auch gefallen