Escolar Documentos
Profissional Documentos
Cultura Documentos
ndice
Captulo 1 - Bsico do Bsico
Captulo 2 - Variveis
Captulo 3 - Operadores Lgicos de comparao
Captulo 4 - Condio IF e escrevendo o primeiro script
Captulo 5 - Operadores Lgicos de Conexo
Captulo 6 - Usando os Conectores
Captulo 7 - Fazendo loops com o for e script remoto
Captulo 8 - While e Until
Captulo 9 - Operaes matemticas e inicializao de scripts
Captulo 10 - Comando case
Captulo 11 - Funo e Parmetro
Captulo 12 - Comandos sed, cut, pipeline, tr e grep
Captulo 13 - ltimos comandos
Captulo 14 - Indentao
Captulo 15 - Script com janelas
Captulo 1 Bsico do Bsico
Apresentao
Este material dedicado para aqueles que no sabem nada de lgica de programao e Shell
Script, nos captulos a seguir voc ser capaz de criar scripts bsicos a medianos e ter todas as
condies de se aprofundar no tema sozinho, procuro sempre dar muitos exemplos para que voc
entenda de um jeito ou de outro e procure ler devagar para conseguir assimilar o material.
No se preocupe se os conceitos apresentados at o captulo 3 ficarem vagos, a partir do
captulo 4 trabalharemos na prtica e tudo ficar mais fcil. Faa os exerccios antes de ver a
respostas, porque a teoria na programao sem prtica deixa muito a desejar.
Esclarecendo que sei pouco, mas juntando este pouco com criatividade e persistncia, eu
consigo fazer muita coisa.
Script um arquivo com vrias instrues para serem executadas pelo shell que o
interpretador de comandos. Com ele podemos automatizar muitas tarefas no Linux criando grandes
facilidades.
Primeiros Comandos
Podemos usar qualquer comando nos nossos scripts, desde comandos criados por voc
mesmo (colocando o script dentro de /bin), programas de terceiros e que tem seus comandos no
terminal e principalmente alguns comandos do shell que so muito usados em scripts e pouco
conhecidos no terminal. Vamos v-los agora:
claro que o script a seguir no tem muito sentido, s para visualizarmos a aplicao dos
comandos apresentados anteriormente.
Usando o interpretador de
comandos bash
Comentrios
Diretrios
Comando Sintaxe Descrio
rm -rf rm -rf +diretrio Deleta arquivos/pastas e tudo que estiver dentro (cuidado)
pwd pwd Mostra em qual diretrio estamos
chmod chmod 777 arquivo_ou_pasta Muda as permisses, 777 = permisso total
chown chown user:grupo arq_ou_diret. Muda o proprietrio de arquivos e pastas
cd cd diretrio Entra em diretrios
Usurios
Comando Sintaxe Descrio
useradd useradd luiz -g alunos (no grupo) Adiciona um usurio
userdel userdel usurio Deleta usurio e seus arquivos
groupdel groupdel grupo Deleta um grupo
groups groups nome_usuario Mostra os grupos do usurio
addgroup usuario grupo ou addgroup nomedogrupo
addgroup Cria um grupo ou adiciona um usurio ao grupo
sudo sudo comando Executa comandos como root
whoami whoami Identifica com qual usurio voc esta logado
Rede
Comando Sintaxe Descrio
ifconfig ifconfig Mostra as interfaces de rede
hostname hostname Mostra ou muda o nome de seu computador na rede
ping Ping ip_desejado Dispara pacotes para outro pc, para testar conexes etc
Sistema
Comando Sintaxe Descrio
killall Killall nome_do_programa Mata um processo
whatis Whatis +nome do programa Descreve o que faz o comando
diff diff arquivo1 arquivo2 Compara 2 arquivos
ps ps -elf Mostra os programas que esto rodando
cat cat arquivo_texto Mostra o contedo de um arquivo de texto
grep Comando | grep palavra Filtra a sada do comando, mostra a linha da palavra pedida
ln ln -s arquivo_original atalho Cria atalho
cp cp arquivo destino Copia um arquivo ou diretrio (-R para diretrios)
apt-get apt-get nome_programa Instala aplicativos
find Find +nome Procura por arquivos e diretrios
Compactao
Tar.gz (A melhor em tempo vs compactao)
Comando Funo Descrio
tar -zcf novo.tar.gz pasta_ou_arquivo Compactar z=zip c=compact f=file
tar -zxf pasta_ou_arquivo Descompactar x=extrair z=zip f=file
Tar (Apenas junta)
Comando Funo Descrio
tar -cf arquivo_novo.tar arquivo Apenas juntar os arquivos -c comprimir -f file
tar -xf arquivo.tar Extrair -x extrair -f file
Rar
Comando Funo Descrio
rar a novo.rar arquivo Compacta a = Adiciona
unrar arquivo.rar Descompacta
Tar.xz (Compacta mais)
Comando Funo Descrio
tar -Jcf arquivo_novo.tar.xz arquivo Compactar -J = xz -c cria -f files
tar -Jxf arquivo.tar.xz Descompactar -x extrai -P preserva
permisses
Captulo 2 Variveis
So muitos os valores que lidamos na programao e eles variam muito, por isto que
existem as variveis, elas podem assumir qualquer valor numricos ou alfanumricos a qualquer
momento.
Portanto, varivel um nome com um valor dentro dela que fica armazenado na memria
para ser usado quando preciso. (seu nome nunca comea com nmero).
Exemplificando:
Posso criar um script que necessite colher o nome de alunos, mas a cada rodada o nome ser
diferente, ento eu posso criar a varivel ALUNO que armazenar este valor dentro dela.
Com o simbolo $ antes da varivel, prevalece o valor que esta dentro dela.
Exemplo: Dentro da varivel FAZER tenho este valor mkdir programa
No script digito uma linha assim: $FAZER
O que vai acontecer ???
O shell vai dar o comando mkdir programa criando o diretrio pedido
Por causa do simbolo ele considera o contedo
Comparadores Numricos
Exemplificando:
Supondo que a varivel A tem o valor de 30 e B tem o valor de 20, ento poderamos ter as
seguintes situaes:
Ele no executa o comando, porque a condio no satisfeita, pois, A no menor que B.
se [ $A -lt $B ]; ento faa (se A menor que B ento faa o comando) Condio
comando Falsa
Neste caso, ele executaria o comando, porque a condio satisfeita, j que A diferente de B
se [ $A -ne $B ]; ento faa Condio
comando Verdadeira
Comparadores Alfanumricos
= Texto igual
!= Texto diferente
-n Texto no nulo
-z Texto nulo
Suponhamos agora que A contm a palavra noite e B contm a palavra dia, ento:
Aqui ele no executa o comando, porque A no igual a B.
se [ $A = $B ]; ento faa
comando
Aqui ele executa o comando, j que A diferente de B.
se [ $A != $B ]; ento faa
comando
Com o -n ele executar o comando caso a varivel tenha algum valor, j com o -z, s
executar se a varivel estiver vazia. Embora esteja na tabela de alfanumricos eles tambm
funcionam se a varivel conter apenas nmeros. Vamos ver como escrev-los no prximo captulo.
Captulo 4 Condio IF e escrevendo o primeiro script
Condio IF
No ingls if significa se, (SE a condio for satisfeita eu executo o comando), condio
que ser testada usando o conceito anterior. Se o teste de comparao acusou verdadeiro ele executa
o comando que est dentro do if, o teste acusando falso ele pula este if e segue com o script.
Pense nos operadores de comparao como se fossem chaves e o if sendo a porta, se a chave
for verdadeira ela abre a porta e executa o que tem l dentro, se a chave for falsa o shell no
consegue abrir a porta e consequentemente no executa. Neste captulo aprenderemos como
escrev-lo na linguagem do shell e consequentemente o primeiro script.
Estrutura do if
Traduo
Se o contedo da varivel USUARIO igual a palavra julia ento execute o comando,
que no caso cria um diretrio com o nome de julia.
Uma funo complementar e muito til no comando if o else (seno), caso a condio do if
no seja verdadeira, ele automaticamente executa o que est no else, seu uso opcional.
Se a varivel ESTADO diferente de desligado, ento execute o comando killall... seno ...
Agora que sabemos escrever a condio if, vou mostrar como se escreve os operadores
lgicos de comparao -n e -z, prometidos anteriormente, eles so escritos antes da varivel a
ser comparada como nula ou no nula.
Supondo que voc necessite rodar um comando apenas se a varivel conseguiu colher os
dados do comando ps por exemplo (para verificar se determinado programa esta rodando), no
hesite em usar o -z e o -n.
Antes de fazermos o nosso primeiro script vamos juntar as peas: vimos os comandos
bsicos, o conceito de variveis, os operadores de comparao e por ltimo o comando if. Se
juntarmos isto mais as pequenas dicas a seguir seremos capazes de fazer o primeiro script.
Uma funo interessante em alguns editores de texto no Linux, que eles facilitam a
visualizao e escrita de scripts, colorindo os comandos e suas estruturas, recomendo o gedit ou
pluma. Para que esta funo seja ativada necessrio colocar no comeo do script #!/bin/bash ou
#!/bin/sh etc, e salvar, esta linha especifica o interpretador de comandos, caso no tenha o shell
executa qualquer um. (caso no fique colorido basta modificar a opo que fica no rodap mudando
de texto sem formatao para sh )
Lembretes:
- Preste muita ateno nos espaos, porque se der espao a mais ou a menos no vai rodar.
- Lembre-se de sempre fechar o if fi
- Os comandos sempre so executados de cima para baixo sequencialmente, ou seja, s executa a
prxima linha quando terminar a atual, a no ser que usemos o &
- Quando houver erros, o terminal mostra em qual linha o mesmo est, nem sempre aquela linha
- Voc pode saltar quantas linhas quiser
Funo do script Temos 3 mdicos, cada um atende num turno diferente, o usurio
informa qual turno deseja se consultar e o programa mostra o nome do mdico do turno escolhido,
s isso!
Etapas do script:
Resoluo
Captulo 5 Operadores Lgicos de Conexo
Com estes operadores podemos conectar duas ou mais condies criadas com os operadores
de comparao, criando assim mais de um evento a ser testado pelo shell, abaixo aprenderemos
sobre os conectores E e OU.
* No exemplo acima temos dois conectores, mas s exemplo, j que o correto ali seria apenas um
conector.
Exemplificando:
Vamos considerar esta lgica como se fosse um porteiro e ele libera o acesso de acordo com
a situao descrita abaixo:
Eu fiz um script que diminua a velocidade dos meus downloads para 100k quando a minha
irm conectava o notebook, mas quando o pc da minha me estava ligado simultaneamente, como
eu poderia diminuir a velocidade para 50k compensando duas mquinas ligadas? Ento eu criei um
if para esta situao.
Aqui a conjuno verdadeira se uma ou outra condio for verdadeira (sendo as duas
verdadeiras tambm vlido):
N Condio 1 Conector Condio 2 Resultado do teste Explicao
1 V ou V Verdadeiro Porque pelo menos uma condio verdadeira
2 F ou V Verdadeiro Temos uma condio verdadeira, e suficiente
3 V ou F Verdadeiro Temos uma condio verdadeira, e suficiente
4 F ou F Falso Nenhuma condio verdadeira para validarmos
Exemplificando:
Vamos usar o mesmo exemplo da conexo anterior, s que desta vez eu preciso que apenas
uma condio seja verdadeira para que ele execute o comando, trocaremos o e pelo ou.
Pegando o exemplo anterior do script que diminui a velocidade da internet, podemos pensar
na seguinte situao: E se eu quisesse diminuir a velocidade da internet para 100k
independentemente da quantidade de pcs ligados, ou seja, se o pc da minha irm OU o pc da minha
me estiverem ligados, ou se os dois simultaneamente diminui para 100k e pronto.
1 condio 2 condio
Note que os comandos if no esto usando aspas nas variveis e nem nos valores, justamente
por se tratarem de valores numricos/matemticos.
Usando o conector
Neste script fui obrigado a usar o conector -a para definir o horrio da tarde, j que estar de
tarde significa ser mais que 13 horas E menos que 18 horas.
Exerccio 2 - Escrevendo scripts mais elaborados
A funo do script informar a classe do carro conforme pedido pelo usurio
Conseguindo fazer o script acima teremos atingido os nossos objetivos at aqui, agora
faremos um script que exige um pouco mais de raciocnio, se voc no conseguir fazer no se
preocupe, pode continuar com os prximos captulos que o raciocnio lgico mais apurado
vem com o tempo.
Incrementos:
Se digitar ligado ou desligado errado, avisar o usurio e sair
Se o usurio digitar desligado para os dois, retornar o valor de zero
Resoluo
Captulo 7 Fazendo loops com o for e script remoto
J parou para pensar como podemos deixar um script independente, que fique ali de
prontido vigiando as situaes e executando comandos de acordo com o que acontece, sem
precisar de nenhum gatilho humano, o tempo que for, como se fosse uma sentinela.
Isto possvel com o for, ele um dos comandos que possibilita a insero de loops em
scripts, a sua traduo para, ou seja, para determinada condio faa o comando enquanto ela
for verdeira.
Maior e menor
Ao usar o comando for temos que saber o sentido destes dois comparadores ( > < ),
eu uso a seguinte regra para no confundi-los:
Pense em duas barras Eu quero dizer para o shell que Ficando assim:
A menor que B ento eu
diminuo o lado da barra em que
est o A. Lado que foi fechado
ou seja do menor
Sintaxe
Os parnteses estaro sempre desta forma
Ateno
Para a varivel loop que vale zero
Rode os comandos enquanto ela for menor que 3 Este loop rodar 3 vezes, nestes valores
E a cada rodada acrescente + 1. da varivel loop 0, 1 e 2
Acontece isto:
Ele verifica a condio e roda uma vez, $loop passar a valer 1, ele verifica se loop estiver
menor que 3 ele roda novamente, depois ele verifica e v que loop vale 2 e que a condio ainda
verdeira e roda novamente, agora loop vale 3 e no menor do que 3, ento ele deixa de executar o
for e continua o script, j que a condio passou a ser falsa.
Como enchemos o comando de placas, coloquei o
cdigo ao lado sem nenhuma poluio.
A condio deve ser verdadeira ao passar pelo for na primeira vez, caso seja falsa passar direto
e no voltar para execut-lo, ento preste ateno na hora de montar a lgica. Salvo em momentos
que voc colocar um loop dentro de outro loop e o primeiro rodar at criar condies de cair no
segundo.
Trazendo a lgica que vimos acima, para criarmos loops infinitos, basta fazer uma condio
que jamais deixar de ser verdadeira. Exemplo:
Se criarmos um loop com comandos rpidos, o script dar milhares de voltas em poucos segundos,
recomendado colocar um sleep dentro do for limitando assim o tempo das rodadas.
Tenho mais duas formas de escrever o for que funciona um pouco diferente do que
expliquei anteriormente, como eu nunca usei na prtica vou apenas apresentar.
O script remoto ficar ao seu dispor para executar qualquer comando, usaremos o Dropbox,
assim pelo celular ou qualquer dispositivo com internet voc poder comandar o script, mas fique
vontade de no usar o Dropbox e colocar os arquivos em qualquer diretrio do pc, j que a nossa
inteno o aprendizado e testar nosso script.
Para o script apontar corretamente a home
de qualquer usurio que o execute, basta
usar uma das duas opes abaixo:
Funcionamento $HOME ou /home/$USER
Exemplo: echo teste > $HOME/arquivo
- O script rodar 1 vez a cada minuto se transformar em: /home/luiz por exemplo
- A cada rodada ele l o arquivo-texto
- No arquivo-texto escreveremos o comando desejado
- Ele executa o comando digitado e limpa o arquivo-texto
Avisos
- Zere ou crie o arquivo comando usando o echo "" > $HOME/comando (fora do loop)
- Voc dever usar um certo recurso para o script no ficar agarrado no comando (cap. 1)
- Use echo $loop dentro do for, seno vai parecer que deu pau
- Na construo do script diminua o tempo de loop para fazer os testes
Se o script for desligar o computador ou qualquer outro comando que exija privilgios, rode
ele como root, caso contrrio execute como usurio normal que bem melhor j que abrindo
um programa como root as configuraes estaro diferentes do normal.
Incremento
- Se escrever vivo? - ele responde sim vivo, esperando o comando, a reposta estar num
arquivo de leitura (avisos).
Resoluo
Captulo 8 While e Until
Digamos que os dois comandos descritos aqui tem um pouco do if e um pouco do for,
um pouco do for porque eles tambm tem como caracterstica rodar em loop e um pouco do if
porque tem a mesma estrutura e necessitam de uma condio para rodar.
While
While em ingls significa enquanto, ou seja, enquanto a condio for verdadeira faa o
comando, no if se a condio verdadeira ele roda uma vez, aqui ele vai rodando enquanto ela
for verdadeira (fica agarrado dentro dela at mudar para falsa).
Podemos usar um valor numrico para determinar quantos loops teremos, podemos dar
opo do usurio digitar se quer tentar novamente etc. O importante usar uma varivel para
pescar o while ou until.
Sintaxe
while [ Condio ];do Da mesma forma que o if, no while e until usaremos os
comando operadores lgicos de comparao ensinados no cap. 3
done
Tanto no while quanto no until o valor da varivel que ele usar como referncia para rodar
deve estar definido antes de chegar no comando em questo.
Nmeros
Usando o mesmo conceito do for podemos ver que o script abaixo dar cinco voltas: 0, 1,
2, 3 e 4. Eu no ensinei a lidar com matemtica, mas basta seguir o conceito abaixo, no coloque
aspas na soma e respeite os espaos visveis (a mesma coisa vale para a condio comparativa).
O script poder fazer algo que s o usurio pode decidir quando prosseguir,
ento ele responde continuar e o while automaticamente sair do loop.
Until
Until significa at at que determinada condio seja verdadeira execute, ou seja, ele
executa se a condio for falsa e s termina quando ela for verdadeira. Ento eu posso usar uma
varivel de valor 5 e at que ela se torne 10 vai rodando e dentro do until usaremos a mesma sintaxe
de soma que usamos no while. O dado que determina o loop tambm pode ser texto, mas no acho
interessante, o importante us-lo quando achar necessrio executar o at.
Sintaxe
until [ Condio ];do Podemos ter mais de uma condio tanto no while quanto no until
comando usando os conectores E e OU apresentados no cap. 5
done
Ele idntico ao while, tendo apenas a sua lgica invertida, tudo que abordamos com o
while anteriormente vale para o until, ento no explicarei novamente, vou dar um exemplo:
Este script ter utilidade quando aprendermos sobre funes, j que ela um atalho que nos
joga para determinada parte do script, ento supondo que faamos um programa de cdigo fechado,
o usurio s conseguiria executar determinada parte do script se digitasse a senha corretamente e o
atalho estaria dentro do while ou until.
Resoluo
Captulo 9 Operaes matemticas e inicializao de scripts
J vimos um pouco de matemtica quando somamos o valor da varivel +1 para contarmos o
loop:
Quando o script precisar literalmente fazer contas igual uma calculadora, usamos a sintaxe
abaixo, deixando a conta sempre entre os dois parnteses e associando o resultado a uma varivel,
neste comando no faz diferena escrever com ou sem espao.
difcil dar exemplos prticos, eu usei pouqussimas vezes contas em script, a no ser que o
seu programa seja mais voltado para matemtica.
Devemos salientar que se o valor for considerado matemtico devemos ter cuidado com as
aspas no if, while etc.
Podemos ter outras variaes que podem dar certo, voc sabendo estas 2, vamos complicar pra qu?
Inicializando scripts com o sistema e programando-os
Daqui para baixo no se preocupe em decorar nada, use para consultas futuras.
Alm das opes abaixo voc tambm pode colocar o script nos Aplicativos de Sesso
Inicializao
Rc2.d
Com o diretrio rc2.d o script ser uma das ltimas coisas a serem executadas como root,
basta seguir o passo a passo abaixo:
coloque o script em /etc/init.d
coloque seu atalho em /etc/rc2.d/
Atalhos comeando com nome S99 so os ltimos executados, podendo ficar assim:
/etc/rc2.d/S99meus_cript
Se voc quiser trabalhar melhor a ordem de execuo, s dar
um ls /etc/rc2.d e verificar os scripts que constam l.
Rc.local
Estrutura do case
Supondo que criamos um menu com 3 opes para o usurio escolher uma, o case executa o
comando de acordo com o valor recebido pela varivel.
Caso o valor da varivel esteja em 1, 2 ou 3 faa os comandos
correspondente a seu valor
O nmero ou palavra da opo fica antes dos parnteses e do lado ou abaixo ficam
os comandos a serem executados (1 em cada linha).
Exemplo na prtica
Podemos precisar mostrar na tela textos usando o echo que contenham acentos ou smbolos, neste
caso obrigatrio coloc-los entre aspas, seno erro atrs de erro, eu sempre coloco entre aspas
assim menos uma coisa para se preocupar (as variveis que ficaro dentro de aspas fazem a sua
funo de mostrar seu contedo normalmente)
So 3 rodadas no total e em cada uma delas o script multiplica o nmero dado pelo usurio
com o nmero indicado abaixo:
1 rodada 10
2 rodada 20
3 rodada 30
Ento se o usurio digitou 3, sero 3x10 3x20 e 3x30 mostrando na tela um resultado a cada
loop, o desafio aqui fazer uma multiplicao diferente a cada rodada j que no podemos prever o
nmero que ser digitado pelo usurio.
Existem vrias formas de se fazer este pequeno script, aqui usaremos o while e case para
alcanarmos os nossos objetivos. Se voc tiver dificuldades saiba que usaremos 90 % do tempo para
pensar e 10 % para escrever o script.
Resoluo
Captulo 11 Funo e Parmetro
Funo
Para quem no conhece o protec (no deixa o protetor de tela ficar entrando nos nossos vdeos),
s baix-lo no link http://www.mediafire.com/download/rrdrwl0ceicz8y9/protec.zip
No desenho ao lado
podemos reparar que temos 3
funes e elas so acessadas
dentro dos cdigos de ajuda e
teste.
No seria vivel faz-lo
com o case porque eu teria que
repetir os cdigos em vrias
partes do script e o que eram
quase 1000 linhas se tornariam
1500 ou mais.
Na parte de ajuda em determinado momento eu perguntarei ao usurio se ele deseja instalar
o Protec, ProtecContinuo ou testar, usando o valor da varivel vou comparar no if ou case
executando assim a funo que desejamos. Ento no desenho apresentado podemos visualizar com
as setas para onde o shell pode ir e da mesma forma poderamos criar acessos de vrios pontos para
vrios pontos.
Entenda que podemos fazer uma salada mista com os comandos que vimos at aqui, while dentro
de while, if dentro de if e dentro deste if um while etc. No fique com receio de fazer estes tipos de
cdigos porque muitas das vezes esta baguna que deixa o nosso script mais fcil de montar
Sintaxe
A sintaxe da funo ser sempre a mesma, como mostrado abaixo, primeiro o nome dela (no
meu exemplo instala) depois dois parnteses sem espao dentro e uma chave apontando para
esquerda. Nas linhas abaixo voc coloca os cdigos a serem executados na funo e quando
terminar coloque outra chave apontando para direita fechando a funo.
Depois de declarar a funo ao shell vamos cham-la, para fazer isto basta escrever o nome
da funo na linha desejada, no exemplo abaixo o usurio j instalou o Protec e se desejar instal-lo
para outro player deve digitar a letra i, assim cai no if que tem uma linha chamando a funo de
nome instala o que faz ele pular de onde est indo para outra parte do script.
A funo deve ser mostrada ao shell antes de ser chamada, vamos supor, eu tenho uma funo
no meio do script e resolvo cham-la no comeo, no vai funcionar porque o shell no leu ainda,
eu sempre coloco as funes no comeo do script assim d menos trabalho
Parmetros
Os parmetros so valores armazenados em variveis pr-determinadas, estes valores so
fornecidos quando o usurio digita o comando que chama o programa/script pelo terminal, depois
de digitar o chamador damos espao e digitamos o primeiro parmetro e assim sucessivamente
conforme mostrado abaixo.
Sem saber usamos os parmetros no terminal, o comando apt-get install firefox, apt-get o
comando do programa, install e firefox so os parmetros, internamente o apt compara o valor do
primeiro parmetro para saber se instala, remove etc. E depois ele pega o segundo parmetro que
ser o objeto a ser tratado.
claro que o apt muito mais do que isso e temos comandos gigantescos com vrios
parmetros que eu no fao ideia da explicao, porm se voc pegou a noo de parmetros j o
suficiente.
Se o usurio no digitar os parmetros o script vai rodar, o que pode acontecer o mesmo dar pau
por falta de dados
http://aurelio.net/shell/
Sintaxe
Para declarar mais de 10 parmetros no shell, basta colocar sua expanso entre chaves:
${10}
${11}
${12}
E assim sucessivamente
Bons estudos e procure entender a lgica de programao mais do que decorar comandos
Resoluo
Captulo 12 Comandos sed, cut, pipeline, tr e grep
Os comandos apresentados aqui deixam o script mais inteligente ajudando-o a ler,
escrever, filtrar, colocar mais de um comando na mesma linha etc.
O texto abaixo ser usado de exemplo nas prximas ferramentas mostradas aqui
L1 - Contribuir com o software livre contribuir consigo mesmo,
L2 - porque hoje voc usa a tecnologia criada por algum no passado
L3 - e amanh outros podero desfrutar da sua contribuio iniciada hoje.
Sed
O comando sed tem vrias funcionalidades relacionadas a filtragem, como exibir linhas com
determinada palavra, extrair um trecho do texto, trocar linhas de lugar etc. Como o material do
mesmo vasto vamos aprender apenas a filtrar textos especificando por linha, o que nos ajudar nas
filtragens.
Linha 2
Mas isto no o suficiente, devemos executar algum comando para que ele filtre sua sada,
seja o ls, cat, ps etc. Abaixo eu usei o comando cat (exibe o contedo de arquivos-texto) no nosso
texto exemplo e filtrei com o sed.
Agora sim, a sada do comando cat so 3 linhas, o sed pega este resultado faz a filtragem e
mostra apenas a linha 2. Veremos a barra antes do sed nesta aula, por enquanto basta
saber que faz o sed processar o resultado do primeiro comando.
Como somos usurios iniciantes no shell apresentei apenas o bsico e na sua caminhada
voc poder conhecer os vrios recursos que este comando tem.
Cut
Com o cut limitamos a sada dos comandos em campos, este texto que escrevo podemos
considerar que seus campos so determinados pelo carcter espao, ento se eu pedir ao cut que
me mostre o contedo do campo 3 ele me retornar a palavra cut, porque as palavras so os
campos e os espaos mostram ao shell onde a delimitao dos mesmos, nada te impede de usar a
letra a por exemplo como delimitador, sair um resultado muito louco, com isto digo que voc
quem determinar o que ser o delimitador e consequentemente os campos.
No exemplo anterior considerei o texto no tendo nenhum enter, ou seja se temos um
arquivo com vrias linhas que so exibidas separadamente, o cut mostrar o campo X de cada linha.
O texto abaixo por exemplo, podemos usar o delimitador dois pontos
mouse:azul:novo
carro:branco:usado
radio:preto:novo
Ento usando o comando cut para mostrar o campo 2, seria exibido isto:
azul
branco
preto
O importante sempre procurar padres que lhes sirvam de base para chegar no contedo
que alimente corretamente o script. No comando ps podemos filtr-lo de uma forma que cheguemos
somente no pid, o problema que o pid passando de certa numerao ganha mais um carcter
numrico diminuindo um carcter espao, ou seja o seu comando que funcionava perfeitamente,
simplesmente no vai servir mais (tem maneiras de contornar isto, mas no abordarei aqui).
Ento preste ateno em todas as variaes possveis para evitar erros no script que nem
sempre so fceis de enxergar.
Sintaxe
Comando -f mais nmero do campo a ser Aqui mostro o carcter que determina o
mostrado campo espao.
Da mesma forma que o sed, o cut tambm precisa de usar o resultado de outro comando:
Resultado do comando acima dado no texto exemplo (somente na primeira linha e sem o L1):
isto que tnhamos sobre o cut e nunca esquea que um dia voc precisar de uma
informao to especifica para o seu script e o cut + sed sero a soluo.
Pipeline
Muitas vezes precisamos pegar a sada do comando A para usarmos no comando B e chegar
no resultado final com o comando C, D etc. Alm disto podemos diminuir o tamanho do script
juntando vrios comandos na mesma linha, exatamente isto que o pipeline faz, ele representado
pelo smbolo | que est ao lado da letra z bastando digit-lo com o shift.
Acima dou 3 pings, limito a sada para o campo 1 (determinado por espao) e o resultado
disto eu ainda pego e mostro apenas a linha 4 usando o sed.
Para usar o pipeline basta ter criatividade, seja para chegar num resultado que seria mais
difcil de encontrar sem o pipe ou apenas para compactar o script, o importante sempre testar,
porque nem tudo que parece funcionar vai funcionar.
Tr
Com este comando possvel substituir caracteres de um texto por outros, claro que
podemos incluir como texto um script ou um arquivo de configurao por exemplo.
Sintaxe
Ficando assim:
Contribuir com o softw4r3 livr3 contribuir consigo m3smo,
porqu3 hoj3 voc us4 4 t3cnologi4 cri4d4 por 4lgum no p4ss4do
3 4m4nh outros pod3ro d3sfrut4r d4 su4 contribuio inici4d4 hoj3.
Lembrando que este foi um resultado mostrado na tela e se precisarmos de uma ao definitiva
necessitaremos direcionar a sada para um arquivo-texto (pode ser o mesmo)
Grep
Com o comando grep tambm filtramos sadas, mas aqui por palavra e no por nmero de
linha, este comando mostra todas as linhas onde haja a incidncia da palavra especificada, ele
muito usado para filtrar sadas extensas no terminal.
Sintaxe
No comando acima eu listo os diretrios e peo o grep para mostrar todos que tenham a palavra vlc.
Vamos supor que vou dar o comando ls -la no /home o resultado ser bem grande, mas
eu desejo localizar os diretrios contendo o nome gnome, ento
Sem grep Com grep
Se houver qualquer dificuldade com este comando basta trein-lo no terminal filtrando as
sadas dos comandos que voc est acostumado usar.
Pode ser o ms que desejar, este no vai ter resposta porque de um jeito ou de outro voc
conseguir chegar no resultado esperado.
Captulo 13 ltimos comandos
Contando as linhas com o WC
Alm de linhas o wc conta bytes, caracteres, palavras etc. Vide manual (man wc), ele pode
ser muito til j que em determinadas situaes precisaremos saber o nmero de linhas totais para
rodar um loop por exemplo.
Sintaxe
Aqui o cat mostraria todo o texto como temos o wc ele pega a sada conta quantas linhas e
mostra somente a contagem na tela. Muito simples j que voc conhece o funcionamento de
comandos que usam a sada de outros comandos.
Caso precise usar o texto alm de sua contagem, o recomendado direcionar a sada do
cat para um arquivo-texto > e em outra linha usar o comando wc neste arquivo.
Time
Podemos cronometrar o tempo de execuo dos comandos executados no shell, para isto
basta colocar o time antes do comando assim:
No momento eu no fao ideia de uma aplicao prtica deste comando que no seja a
curiosidade, mas nunca se sabe quando criaremos um programa que necessite colher os dados do
tempo de execuo de determinado comando.
Sort
Muitas vezes precisamos que o script execute determinado comando e que no seja
mostrado nada na tela para o usurio, para isto direcionamos a sada para um buraco negro no
Linux.
Exemplo:
Acima dois comandos de um script onde era melhor no confundir o usurio com a sada
dos comandos.
Figlet
Com o figlet podemos exibir as famosas escritas feitas no terminal, Dando assim uma
incrementada no seu visual:
Sintaxe:
figlet palavra
provvel que o figlet no venha instalado por padro, por isto dependendo do contexto
voc pode usar o prximo comando.
Which
Com este comando verificamos se determinado programa esta instalado, como mostrado
abaixo o programa mpg123 no estava instalado por isto o valor retornado foi vazio enquanto que o
firefox j estava e ele mostrou onde o executvel se encontrava.
Sintaxe
which programa
Abaixo eu criei uma varivel que recebe o valor do comando which, se ela estiver vazia eu
pergunto ao usurio se ele deseja instalar o mpg123.
Id -u (verificando se root)
Algumas vezes o script roda da maneira esperada apenas como root ou como usurio
normal, para fazer esta identificao usamos o comando id -u, quando executado ele pode
retornar o valor 0 (zero) o que significa que estamos logados com usurio detentor de privilgios
root caso contrrio indica que o mesmo no tem privilgios.
A sintaxe simplesmente id -u, abaixo temos as primeiras linhas do protec onde o mesmo
no pode ser executado como root seno temos uma srie de erros, ento a primeira coisa que o
programa faz a verificao e caso o usurio seja root mostrado uma mensagem e exit.
Linhas do Samba
Com as linhas abaixo gravadas no /etc/samba/smb.conf j so suficientes para compartilhar
arquivos na rede.
[global]
workgroup = admin # Nome da rede
name resolve order = lmhosts wins bcast host # Evita erros de mapeamento
Resoluo
Captulo 14 Indentao
Indentao um recuo no texto, na programao usamos para deixar os cdigos mais
legveis facilitando assim a compreenso das vastas linhas de um script. No shell ela no
obrigatria, mas se vamos escrever centenas de linhas recomendvel us-la.
Como no domino o tema vou dar a minha contribuio da forma que uso, ento sinta-se
vontade em aprofundar no tema.
O conceito simples se temos um cdigo dentro de outro damos 3 espaos e assim por
diante.
Acima temos o if dentro do while, por isto ele est 3 espaos a frente e dentro do if temos
uma chamada de funo instala e tambm est 3 espaos a frente, a situao do else a mesma
do instala consequentemente esto na mesma coluna e como o exit est dentro do else
consequentemente ele recebe os espaos.
Repare os comandos que fecham o while e if eles esto rentes aos comandos que os abrem
(olhe os pontilhados), assim mesmo se tivermos um nmero grande de ifs, whiles etc. no script no
dar tanta confuso j que fica mais fcil de visualizar onde comea e onde termina as estruturas e
quais comandos esto dentro de quais comandos.
Outra coisa que recomendo usar comentrios para dividir sees no script:
#######################################################################
######################## CHAMA AJUDA ###############################
######################################################################
Cdigos
#######################################################################
######################## DESINSTALA #################################
######################################################################
Cdigos
As janelas so uma espcie de interface grfica para os nossos scripts que interagem com o
clicar do mouse, usando elas melhoramos em muito sua aparncia e facilitamos a interao com o
usurio. Ns poderemos recolher senhas, respostas, dar simples avisos etc. Vai depender do tipo que
usaremos com o comando.
Este tipo possibilita mostrar uma mensagem na tela bastando dar ok depois de lida para
prosseguir no script.
Sintaxe/Exemplo
dialog --msgbox 'Esta uma area restrita' 7 40
Aqui mostramos uma mensagem e logo em seguida o script continua executando sem pedir
confirmao.
Sintaxe/Exemplo
dialog --infobox 'instalando os pacotes' 10 40
Textbox (caixa de texto)
Com este tipo podemos exibir um arquivo-texto no terminal como instrues, configuraes
etc. abaixo peo para o shell mostrar o arquivo de configurao do samba:
Sintaxe/Exemplo
dialog --textbox /etc/samba/smb.conf 40 60
Onde o usurio clica em + para subir o texto e temos a porcentagem do que j foi exibido.
Agora podemos fazer uma pergunta ao usurio e esperar que o mesmo responda yes ou no
Sintaxe/Exemplo
dialog --yesno 'Deseja instalar agora ?' 5 30
if [ $? = 0 ]; then
apt-get install firefox
else
Zero corresponde a sim
echo "Voc pode instalar o navegador mais tarde"
exit
fi
Foram apresentadas as janelas mais simples se voc deseja usar outros tipos, abaixo temos
uma apresentao breve para que voc possa pesquisar sua utilizao:
#!/bin/bash
# Se dou opo numrica melhor, assim evitamos do usurio digitar errado ou com acentos
echo "Por favor digite a opo do turno desejado"
echo
echo "1 - Manh"
echo "2 - Tarde"
echo "3 - Noite"
echo # Espao para no ficar embolado com a resposta
# Estou colocando como alfanumrico porque no vou fazer clculos e no quero ter problemas
if [ "$TURNO" = "1" ];then
echo "Apenas o Doutor Wagner atende no turno da manh"
fi
# Saindo
exit
Exerccio 2 Script mais elaborado
#!/bin/bash
exit
Exerccio 3 - Lgica dos PC1 e PC2
#!/bin/bash
echo "Por favor, digite ligado ou desligado para informar o estado dos computadores abaixo"
echo
echo "PC1"
read PC1
echo
echo "PC2"
read PC2
echo
# INCREMENTO, Se o usurio digitou algo que no seja ligado e desligado, ento cai neste if
if [ "$PC1" != "ligado" -a "$PC1" != "desligado" ];then
echo "Estado invalido para PC1, tente novamente"
sleep 3
exit
fi
# Posso usar tanto "PC2 = desligado" quanto "PC2 != ligado" a segunda opo vai no resto do script
# Se pc 1 estiver ligado e o 2 estiver desligado faa o comando
if [ "$PC1" = "ligado" -a "$PC2" = "desligado" ];then
echo "Valor da amostra igual a 5"
fi
# Acima, se eu no incluir o PC2 desligado vai virar uma baguna e cair naquele if mesmo quando
# PC2 estiver ligado, ou seja, mostrar mais de um resultado
# No corre o risco do "!= ligado" ser outra palavra que no seja desligado, j que o primeiro
# Incremento se encarregou de eliminar outras escritas
if [ "$PC2" = "ligado" -a "$PC1" != "ligado" ];then # Se PC2 estiver ligado ...
echo "Valor da amostra igual a 10"
fi
if [ "$PC1" = "ligado" -a "$PC2" = "ligado" ];then # Se PC1 e 2 estiverem ligados cai aqui
echo "Valor da amostra igual a 15"
fi
exit
Exerccio 4 - Remoto
#!/bin/bash
# Loop infinito
for ((loop=2;loop>1;loop++));do
# Se a varivel COMANDO no estiver vazia, ento vou executar o comando dentro dela
if [ -n "$COMANDO" ];then
$COMANDO& # Coloquei o & para o script no ficar agarrado aqui
echo > $HOME/comando # Limpando o arquivo com o comando
# Escrevendo o comando executado no arquivo avisos
echo "Executei" $COMANDO "loop $loop" >> $HOME/aviso
fi
done
# Ele nunca vai sair do loop infinito ento no justifica colocar o exit
Exerccio 5 - Senha
#!/bin/bash
echo
echo " Seja Bem-vindo"
echo
echo "Por favor digite a senha para logar no sistema"
echo
read SENHA
# Enquanto x for menor que 4, faa (contei com a primeira tentativa acima)
while [ $x -lt 4 ];do
done
# Fora do loop eu coloco estes comandos, ento assim que as tentativas se esgotarem
# Ele sai do loop e executa aqui
echo
echo "Nmero de tentativas esgotado, tente mais tarde"
sleep 2
exit
Exerccio 6 Pequeno desafio de lgica
#!/bin/bash
while [ $VOLTA -lt 4 ];do # Enquanto $VOLTA for menor que 4 faa o comando (roda 3 vezes)
# Estou usando a varivel de loop no case, assim a cada rodada uma opo diferente ser executada
case $VOLTA in
# Pego o valor dado pelo usurio e multiplico pelo valor pr-determinado no exerccio
1) CONTA=$(( $NUM * 10 ))
echo "Rodada 1 - $NUM multiplicado por 10 igual a $CONTA";;
2) CONTA=$(( $NUM * 20 ))
echo "Rodada 2 - $NUM multiplicado por 20 igual a $CONTA";;
# A cada rodada a varivel CONTA receber um valor diferente, ento no precisamos criar
#uma varivel diferente para cada opo do menu
3) CONTA=$(( $NUM * 30 ))
echo "Rodada 3 - $NUM multiplicado por 30 igual a $CONTA";;
esac
done
Exerccio 7 - Funo e parmetro no mesmo script
#!/bin/bash
# eu no fiz os cdigos nesta ordem a toa, algumas caiam numa "sinuca de bico"
echo
echo "Bem vindo $1"
LOGANDO(){
echo
echo "Digite seu CPF para logarmos"
read CPF2
echo
# O shell vai ler as duas funes, depois passa por aqui chamando a funo CADASTRO
CADASTRO
# A nica forma do usurio sair do script digitando o CPF corretamente, se fosse um script
# para empresa claro que colocaramos outras opes
Exerccio 9 Configurando o Samba
#!/bin/bash
WIT=$(which smbd)
# Se o samba no estiver instalado cai aqui
if [ -z "$WIT" ];then
echo "O samba no est instalado, deseja instal-lo agora? s/n"
read INSTALA
if [ "$INSTALA" = "s" ];then
apt-get install samba
else
exit
fi
fi
echo
echo "Seja Bem-vindo, a seguir vamos configurar um compartilhamento publico"
echo "Escolha a opo desejada"
echo
echo "1- Para nova configurao"
echo "2- Para adicionar um diretrio ao compartilhamento j configurado"
echo "3- Adicionar um novo usurio"
read MENU
case $MENU in
1)
echo
echo
echo "Digite o nome da sua rede de compartilhamento"
read REDE
echo
echo "Digite o endereo do diretrio a ser compartilhado"
read DIRETORIO
echo
echo "Qual o nome ser exibido na rede para este diretrio?"
read NOME_DIR
echo "Qual?"
read USU_LA
adduser $USU_LA
smbpasswd -a $USU_LA
echo
echo "mais algum usurio para adicionar? s/n"
read MAIS
done
echo
echo "Agora informe o nome do seu usurio para que eu possa adicion-lo"
read USU
smbpasswd -a $USU
echo
echo "Configurao concluda, aguarde um momento"
echo "De Linux para Linux demora um pouco a iniciar"
exit;;
2)
# Loop que adiciona mais diretrios
MAIS1=$"s" # Garantindo o primeiro loop
while [ "$MAIS1" = "s" ];do
echo
echo "Digite o endereo do novo diretrio a ser compartilhado"
read DIRETORIO
echo
echo "Qual o nome ser exibido na rede para este diretrio?"
read NOME_DIR
echo
echo "Configurao concluda, aguarde um momento"
exit;;
3)
# Loop que adiciona usurios de outro PC
MAIS2=$"s" # Garantindo o primeiro loop
while [ "$MAIS2" = "s" ];do
echo "Digite o nome de usurio"
read USU_LA
adduser $USU_LA
smbpasswd -a $USU_LA
echo
echo "Configurao concluda, aguarde um momento"
exit;;
esac