Escolar Documentos
Profissional Documentos
Cultura Documentos
Shell Script Do Zero
Shell Script Do Zero
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
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:
Comando
Descrio
Sintaxe
echo
sleep
read
Recebe o valor de uma varivel (veremos ainda) read varivel exemplo: read dados
>
Escreve num arquivo-texto (apagando o que estava l) echo texto > /home/luiz/arquivo
>>
&
exit
Sai do script
exit
touch
Cria arquivos-texto
touch nome_do_arquivo
# Comentrio
Sintaxe
Descrio
rm -rf
rm -rf +diretrio
pwd
pwd
chmod
chown
cd
cd diretrio
Entra em diretrios
Usurios
Comando
Sintaxe
Descrio
useradd
userdel
userdel usurio
groupdel
groupdel grupo
Deleta um grupo
groups
groups nome_usuario
addgroup
sudo
sudo comando
whoami
whoami
Rede
Comando
Sintaxe
Descrio
ifconfig
ifconfig
hostname
hostname
ping
Ping ip_desejado
Comando
Sintaxe
Descrio
killall
Killall nome_do_programa
Mata um processo
whatis
diff
Compara 2 arquivos
ps
ps -elf
cat
cat arquivo_texto
grep
ln
ln -s arquivo_original atalho
Cria atalho
cp
cp arquivo destino
apt-get
apt-get nome_programa
Instala aplicativos
find
Find +nome
Compactao
Tar.gz (A melhor em tempo vs compactao)
Comando
Funo
Compactar
Descompactar
Descrio
z=zip c=compact f=file
x=extrair z=zip f=file
Funo
Descrio
-c comprimir -f file
Extrair
-x extrair -f file
Rar
Comando
Funo
Compacta
unrar arquivo.rar
Descompacta
Descrio
a = Adiciona
Funo
Descrio
Compactar
-J = xz -c cria -f files
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).
Para confundir menos, recomendado escrever as variveis com letras maisculas
e nem precisa falar que no se pode escreve-las com acento.
Valor:
Numrico Nmeros armazenados (para fazermos contas)
Alfanumricos Podem ser nmeros, textos ou os dois juntos,
o importante saber que sempre ser considerado como um texto
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
Exemplos de como colher os dados para a varivel:
No se preocupe em decorar estes comandos, procure entender o raciocnio.
Voc mesmo d o valor dentro do script
ALUNO=$Jonatan
Aqui ao invs de chamar de varivel, podemos cham-la
de constante, j que o valor Jonatan no muda, a no ser
que voc crie outra linha modificando este valor
Recebendo o valor digitado pelo usurio
echo Digite o nome do aluno
read ALUNO
Onde read o comando para que o usurio
digite o valor da varivel em questo
Estes operadores so
fundamentais em
scripts/programao.
-gt
-le
-ge
-eq
-ne
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
Falsa
comando
Neste caso, ele executaria o comando, porque a condio satisfeita, j que A diferente de B
se [ $A -ne $B ]; ento faa Condio
Verdadeira
comando
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.
No Shell
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.
Comando auxiliar Else
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.
Sentido do comando
Sintaxe no shell
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.
Vamos fazer nosso primeiro script/exerccio, temos ele pronto no captulo de resoluo de
exerccios, mas claro que voc vai resolv-lo antes de conferir, no precisa ficar igual, basta
funcionar.
Onde escrever os scripts
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 )
Passos a passo de como fazer o script, antes do exerccio:
- Abra o editor de texto escolhido
- Escreva na primeira linha #!/bin/bash
- Agora vamos salvar para que as linhas fiquem coloridas
- Tem pessoas que colocam a extenso .sh no nome do arquivo (tanto faz)
- Para no termos problemas futuros, j vamos dar permisso de execuo (chmod +x script)
- Agora j podemos escrever o script
- Quando o script estiver pronto entre no diretrio em questo e d o comando ./nome_do_script
para execut-lo
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
Exerccio 1 Primeiro Script
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:
1- Mostra um texto de boas vindas ao usurio
2- Pede que o usurio escolha qual turno que deseja se consultar
3- Mostra o texto nestes moldes: Mdico TAL o nico a atender no turno TAL
4- Dorme por 2 segundos
5- Informa que a consulta est marcada
6- O programa dorme por mais 4 segundos e sai
Resoluo
* No exemplo acima temos dois conectores, mas s exemplo, j que o correto ali seria apenas um
conector.
Operador lgico (E)
Entenda conjuno sendo a unio das condies
comparativas feitas pelos conectores.
rasgando o verbo: tudo que esta dentro dos
colchetes do if [ ]
Aqui a conjuno verdadeira se todas as condies de comparao forem verdadeiras,
ento mostro a tabela para entendermos a lgica.
N
Condio 1
Conector
Condio 2
Resultado do teste
Explicao
Verdadeiro
Falso
Falso
Falso
Exemplificando:
Vamos considerar esta lgica como se fosse um porteiro e ele libera o acesso de acordo com
a situao descrita abaixo:
S entra na festa casais que o homem se chama Csar E a mulher Juliana:
1
Csar
Juliana
Paulo
Juliana
Csar
Mnica
Jlio
Muitas vezes vamos esbarrar com a necessidade de usar os conectores, vamos supor que eu
preciso de um if rodando apenas em duas situaes:
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.
Esta a parte que identifica as duas mquinas ligadas:
if [ $NOTE = ligado E $PCMAE = ligado ];then
Comando (wondershaper eth0 400 que igual a 50k )
fi
Eu usei vrios comandos para chegar no valor ligado antes de ser comparado e para outras
velocidades, mas aqui vamos nos prender apenas ao sentido do comando.
Operador lgico (OU)
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
ou
Verdadeiro
ou
Verdadeiro
ou
Verdadeiro
ou
Falso
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.
S entra na festa casais que o homem se chama Csar OU a mulher Juliana:
1
Csar
ou
Juliana
Paulo
ou
Juliana
Csar
ou
Mnica
Jlio
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.
if [ $NOTE = ligado OU $PCMAE = ligado ];then
Comando (wondershaper eth0 800 que igual a 100k)
fi
2 condio
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.
Celta
Palio e Uno
Classe A
Classe B
Classe C
Etapas do script:
- Informar os carros disponveis ao usurio
- Pede ao usurio que digite qual carro deseja ver a classe
- Mostra a classe do carro e sai
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.
Exerccio 3 Lgica dos PC1 e PC2
Ns temos 2 pcs, vamos perguntar ao usurio quais pcs esto ligados (um de cada vez),
depois do usurio ter digitado ligado ou desligado para cada pc, o programa mostra a soma na
tela (no soma feita no shell, leia o quadro abaixo para saber).
Conforme os valores abaixo vamos mostrar na tela o valor total referente a soma dos
computadores ligados. Supondo que o PC1 e PC2 estejam ligados, ento o valor mostrado 15, se
for apenas o PC2 o valor por sua vez ser 10 e assim sucessivamente, o desafio ser estruturar os ifs
para que no apaream informaes demais ou de menos.
PC1
PC2
10
Abre a
Condio
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.
Criando loops infinitos
Trazendo a lgica que vimos acima, para criarmos loops infinitos, basta fazer uma condio
que jamais deixar de ser verdadeira. Exemplo:
Conforme mostrado acima, voc deve concordar comigo que:
- Loop tem o valor de 2
- Para rodar o for loop deve ser maior que 1 (e a condio j verdadeira)
- E o valor de loop nunca vai diminuir, sempre vai aumentar ++
Ou seja, o loop nunca ser menor que 1 para que a condio seja falsa, ento ele rodar
para sempre.
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.
Aqui ele rodar 4 vezes, uma para cada
parmetro, sendo que cada vez que ele rodar, a
varivel cor ter o valor de um parmetro, que
so: azul, vermelho ...
Imagine que voc est saindo de casa faltando 20 minutos para terminar aquele download e
voc precisa ficar presente estes 20 minutos para depois abrir outro programa de download, torrent
por exemplo j que ele atrapalharia o download atual, depois disto seria necessrio desligar o pc
aps 2 horas, converter aquele vdeo pesado ou dar um comando demorado etc. Mas como fazer isto
sem estar presente?
Seja bem-vindo ao nosso exerccio 4 script remoto
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:
$HOME ou /home/$USER
Funcionamento
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
Da mesma forma que o if, no while e until usaremos os
operadores lgicos de comparao ensinados no cap. 3
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.
O loop do while pode usar para rodar:
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
comando
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:
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.
Os smbolos matemticos usados no shell
so os que estamos acostumados
+
*
/
Acima a varivel CONTA igual ao resultado da operao entre parnteses e no echo eu
mostro o resultado.
Uma vez usei este conceito para redundncia, se o comando retornasse 64 eu executaria o
comando 2, s que apenas uma verificao poderia ter falhas, ento coloquei trs verificaes somei
todas elas usando suas variveis e na lgica de comparao eu dizia que poderia executar o
comando se o valor fosse igual ou maior que 64, ou seja, se at duas verificaes falhassem eu
conseguiria o valor 64 o que indicava que pelo menos uma estava funcionando. Abaixo uma
aplicao das operaes matemticas usando variveis.
Infelizmente o shell s mostra resultados inteiros
se a resposta for fracionria ele mostra como
inteiro ou as vezes no funciona.
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.
Aqui fazemos o comando considerando a
condio como um valor matemtico
Podemos ter outras variaes que podem dar certo, voc sabendo estas 2, vamos complicar pra qu?
Cron
/etc/crontab
service cron restart
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
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
Sintaxe
Ns temos os parmetros $1 $2 $3 $4 $5 $6 $7 $8 $9, ento colocamos ele no script no
para receber valor, mas j usando os valores que sero digitados no terminal.
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.
Com o comando acima a sada no texto de exemplo seria esta:
L2 - porque hoje voc usa a tecnologia criada por algum no passado
Para eliminarmos determinada linha:
Usamos a sintaxe abaixo indicando a linha a ser ocultada
Saindo assim o nosso texto exemplo:
L2 - porque hoje voc usa a tecnologia criada por algum no passado
L3 - e amanh outros podero desfrutar da sua contribuio iniciada hoje.
Ou posso eliminar mais de uma linha:
Saindo assim:
L2 - porque hoje voc usa a tecnologia criada por algum no passado
Como somos usurios iniciantes no shell apresentei apenas o bsico e na sua caminhada
voc poder conhecer os vrios recursos que este comando tem.
Caso queira se aprofundar no sed acesse o link:
http://thobias.org/doc/sosed.html
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
Se quisermos mostrar somente a palavra preto s usar o cut e sed
cat texto |
mouse:azul:novo
carro:branco:usado
radio:preto:novo
azul
branco
preto
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
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.
Pipeline
Exemplo simples:
tr
['a,e']
['4,3']
Executando o comando abaixo em nosso texto exemplo, ele substituir a letra a pelo
nmero 4 e a letra e pelo nmero 3.
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)
Uma funo muito til no comando tr a de transformar caracteres minsculos em
maisculos e vice-versa, assim se pedirmos ao usurio que digite algo e que este valor seja
obrigatrio em maisculo ou minsculo podemos transformar este valor com o tr garantindo assim
o funcionamento do script.
Transforma tudo em maiscula
Tudo minscula
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
Comando a ser filtrado e
pipeline para concatenar
Comando grep
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.
Exerccio 8 Usando os comandos
Usando a sada do comando ls -la no /home
Faa um comando que exiba:
Somente o ms de novembro, apenas uma vez e mais nada.
A resposta ser somente Nov
Pode ser o ms que desejar, este no vai ter resposta porque de um jeito ou de outro voc
conseguir chegar no resultado esperado.
cat texto |
wc -l
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
Com o sort podemos ordenar as sadas dos comandos alfabtica e numericamente
Sem nenhuma opo ele classificar as sadas alfabeticamente:
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.
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.
Olhe a diferena dos cdigos sem organizao:
Outra coisa que recomendo usar comentrios para dividir sees no script:
#######################################################################
######################## CHAMA AJUDA ###############################
######################################################################
Cdigos
#######################################################################
######################## DESINSTALA #################################
######################################################################
Cdigos
Onde o usurio clica em + para subir o texto e temos a porcentagem do que j foi exibido.
Yesno (Sim ou no)
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
Foram apresentadas as janelas mais simples se voc deseja usar outros tipos, abaixo temos
uma apresentao breve para que voc possa pesquisar sua utilizao:
gauge
checklist
menu
calendar
fselect
passwordbox
Barra de porcentagem
Mostra um menu para escolhas multiplas
Menu para a escolha de apenas 1 item
Mostra um calendrio para o usurio escolher uma data
Digita ou seleciona um arquivo
Pede uma senha
Exerccio Resolvidos
Exerccio 1 Primeiro script
#!/bin/bash
# Este comeo tem apenas a parte escrita na tela
echo "Bem vindo ao sistema de marcao online"
echo
echo
# 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
# Colhendo os dados do turno
read TURNO
# 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
if [ "$TURNO" = "2" ];then
echo "Apenas a doutora Camila atende no turno da tarde"
fi
if [ "$TURNO" = "3" ];then
echo "Apenas o Doutor Cesar atende no turno noite"
fi
# Fazendo o programa dormir por 2 segundos
sleep 2
echo
echo "Sua consulta foi marcada com sucesso!"
# Dormindo para dar tempo de ler a mensagem e depois sai
sleep 4
# Saindo
exit
Exerccio 4 - Remoto
#!/bin/bash
# Criando ou zerando os arquivos-texto
echo "" > $HOME/comando
echo "" > $HOME/aviso
# Loop infinito
for ((loop=2;loop>1;loop++));do
# Colocando a velocidade do loop em 1 minuto
sleep 60
echo $loop # Mostrando a rodada na tela
# Lendo o arquivo-texto e passando o valor para a varivel
COMANDO=$(cat $HOME/comando)
# INCREMENTO, responde que esta rodando, caso perguntado
if [ "$COMANDO" = "vivo?" ];then
echo "sim vivo, esperando o comando, loop $loop" >> $HOME/aviso
COMANDO=$"" # zerando a varivel para no cair no prximo if
echo > $HOME/comando # Limpando o arquivo-texto
fi
# 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
# zerando a variavel de loop
x=$"0"
# Enquanto x for menor que 4, faa (contei com a primeira tentativa acima)
while [ $x -lt 4 ];do
# Se a senha for igual a 123 ento faa o comando
if [ "$SENHA" = "123" ];then
echo
echo "Senha correta, logado no sistema"
sleep 2
exit
fi
# Se ele no cair no if, pede a senha novamente
echo
echo "Senha incorreta tente novamente"
read SENHA
# colocando +1 para contarmos as rodadas
x=$[$x+1]
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
echo
echo "mais algum diretrio? s/n"
read MAIS1
done
service nmbd restart > /dev/null
service smbd restart > /dev/null
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 "mais algum usurio para adicionar? s/n"
read MAIS2
done
service nmbd restart > /dev/null
service smbd restart > /dev/null
echo
echo "Configurao concluda, aguarde um momento"
exit;;
esac