Beruflich Dokumente
Kultur Dokumente
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:
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
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:
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
Exemplo2:
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
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:
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.