Você está na página 1de 55

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

O que Shell Script

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:

Comando Descrio Sintaxe


echo Exibe o texto na tela echo texto a ser mostrado
sleep D um tempo antes de continuar executando sleep segundos exemplo: Sleep 1
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
>> Escreve num arquivo-texto (ltima linha, no apaga) echo texto >> /home/luiz/arquivo
& Roda o comando em 2 plano e continua o script Comando&
exit Sai do script exit
touch Cria arquivos-texto touch nome_do_arquivo
# Comenta tudo depois deste smbolo # Comentrio
* Comentar quer dizer que a linha um texto e nunca ser executada
Exemplo destes comandos no script

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

Mostrando a frase: Bem vindo, na tela


O echo vazio salta uma linha na tela, para que no fique tudo junto

Comentrios

O comando apt-get roda em 2 plano e o script continua executando

Comandos mais conhecidos

So os comandos que estamos acostumados a usar no terminal e podemos us-los tambm


no script, se voc no os conhece, v aprendendo de acordo com a necessidade, pesquise na internet
e consulte a tabela resumida abaixo sempre que preciso.

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).

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 O Linux case sensitive, ou seja,


echo Digite o nome do aluno se escreveu determinada varivel
read ALUNO em maiscula, voc no pode
mudar para minuscula no meio do
Onde read o comando para que o usurio
Script, porque ele reconhece como
digite o valor da varivel em questo
outra palavra.
Pegando o valor de um arquivo-texto
ALUNO=$(cat /etc/matricula)
O valor da varivel ser o resultado do comando dentro
dos parnteses, neste caso mostra o contedo do arquivo matricula.
Neste caso o usurio digita o nome do programa, e a varivel PACOTE usa
este resultado, exe: se o usurio digitar mplayer, a varivel PACOTE ter o
Valor: protecmplayer.

Aqui PING1 ser o resultado de dois


Pings, depois seu valor gravado no
Arquivo /home/log juntamente com
a data. ( -w 3 para sair 2 pings)

normal usarmos variveis pegando valores que


envolvem outras variveis, aqui eu uso o comando
ps e a varivel $PROG para acharmos a linha de
algum programa, e o resultado deste
comando ser o valor de $RODANDO.

Neste caso o valor da varivel no importa,


pois, sua utilidade de apenas parar a tela exibida
para que o usurio possa ler a mensagem e d enter
para prosseguir.

As variaes so muitas, pesquise e teste na medida que precisar.


Captulo 3 - Operadores lgicos de comparao
Ns vamos ver estes operadores dentro de um determinado contexto, pois o que
necessitamos por enquanto, qualquer funo que seja um pouco diferente do descrito aqui
abordaremos depois do captulo 7.

Os operadores lgicos de comparao mostram ao shell uma condio a ser testada, o


resultado do teste pode ser verdadeiro ou falso, este resultado usado por vrios comandos (vamos
entender estes comandos na medida do possvel), um deles e um dos mais importantes o IF, que
veremos em breve.
Estes operadores so
O que podemos entender como verdadeiro e falso? fundamentais em
A frase abaixo, por mais obvia que seja, ela verdadeira: scripts/programao.
4 menor que 5

Esta tambm verdadeira:


O nome camila diferente do nome Julia

Por fim, esta falsa:


50 diferente de 50

O contedo destes comparadores podem ser numricos ou Alfanumricos (vai fazer


comparao que necessita considerar o nmero matematicamente, ento numrico o resto
alfanumrico), por exemplo, se eu vou lidar com nmeros de cadastros de funcionrios vou
consider-los Alfanumricos porque alm de no ter conta, eu s vou ler como se fosse um texto, j
o numrico pode ser quantidade, comparao (1 menor que 2), clculos etc. Nunca poderemos
confundir estas duas categorias.

Comparadores Numricos

-lt Nmero menor que (Less Than)


-gt Nmero maior que (Greater Than)
-le Nmero menor ou igual (Less Equal)
-ge Nmero maior ou igual (Greater Equal)
-eq Nmero igual (EQual)
-ne Nmero diferente (Not Equal)

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

if [ condio ];then - if Abre o comando


comando - Condio Condio comparativa para execuo dos comandos dentro do if
fi - Comando Qualquer comando do shell e quantos voc quiser
- fi Fecha o if (escrito ao contrrio)

Exemplo na linguagem do shell:


Espao obrigatrio
A palavra julia est entre aspas porque um texto (numricos ficam sem aspas), a mesma coisa vale
para a varivel.

if [ "$USUARIO" = "julia" ];then


No Shell
mkdir $USUARIO
fi

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


se [ condio verdadeira ]; ento execute o comando if [ condio ];then
mkdir $USUARIO comando
seno execute este outro comando else
mkdir $USUARIO2 comando
fi

Abaixo um exemplo escrito no editor de texto:


Valor da varivel a seguir
ESTADO=$operando

Se a varivel ESTADO diferente de desligado, ento execute o comando killall... seno ...

Este pequeno if compara a varivel ESTADO com a palavra


desligado, se a condio for verdadeiras ele mata o player vlc,
seno ele dorme 10 segundos e sai (exit).

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.

Se a varivel PORTA estiver vazia ele mostra o


texto na tela: Varivel sem valor

Ela recebendo algum valor ele mostra:


A varivel no esta vazia

Poderamos dar o pulo do gato e colocar este script


com apenas um if se a varivel no tem valor, mostre
na tela: varivel sem valor seno mostre: A varivel
no esta vazia

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.

Nosso primeiro script


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

Vamos visualizar como ficam os conectores para ficar mais claro:

* 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
1 V e V Verdadeiro Porque as duas condies so verdadeiras
2 F e V Falso falso porque apenas uma condio atende
3 V e F Falso falso porque apenas uma condio atende
4 F e F Falso Nenhuma condio atende

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 e Juliana Entrada permitida (as duas condies so verdadeiras)


2 Paulo e Juliana O nome Juliana bate mas o nome Paulo no atende, barrados !
3 Csar e Mnica O nome Csar est na lista mas o nome Mnica no, barrados !
4 Jlio e Carolina Nenhum dos dois nomes esto na lista, barrados !
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 Para o conector E, basta lembrar:
Comando (wondershaper eth0 400 que igual a 50k ) se tudo verdadeiro ento executa.
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
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.

S entra na festa casais que o homem se chama Csar OU a mulher Juliana:

1 Csar ou Juliana Entrada permitida, as duas condies so verdadeiras


2 Paulo ou Juliana Entrada permitida, pelo menos uma condio verdadeira (juliana)
3 Csar ou Mnica Entrada permitida, a condio (Csar) valida a entrada
4 Jlio ou Carolina Nenhum dos dois nomes esto na lista, barrados !

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
Na linguagem do shell o operador e representado como -a
e o operador ou representado por -o (no confundir com -zero)

Como mostrado abaixo:

1 condio 2 condio

Conectando as duas condies

Do exemplo acima podemos entender: Se a varivel POWER diferente de desligado E a


Varivel PAINEL igual a funcionando ento faa o comando.
Captulo 6 Usando os Conectores
Vamos abordar mais alguns exemplos dos conectores e partiremos para a prtica a seguir.

Podemos usar quantos conectores quisermos:


S todas as condies
sendo verdadeiras que
ele executa

Se pelo menos uma


for verdadeira ele
executa o comando

Exemplo de um script completo, que usa o recurso dos conectores:

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

Ferrari e Lamborghini Celta Palio e Uno


Classe A Classe B Classe C

Etapas do script: Aqui no vale opo numerica


- Informar os carros disponveis ao usurio o usurio deve digitar o nome
- Pede ao usurio que digite qual carro deseja ver a classe do carro, para alcanarmos
- Mostra a classe do carro e sai o objetivo do exercicio

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.

Ateno, no usaremos a funo matemtica de somar, porque nem


PC1 5 aprendemos ela ainda, voc vai fazer a soma de cabea e colocar o
PC2 10 resultado com o comando echo. O objetivo aqui raciocinar e fazendo
pela matemtica iria ficar muito simples e no nosso objetivo neste
exerccio

Temos os incrementos abaixo que poderemos adicionar ao exerccio opcionalmente


oferecendo a voc mais algumas atividades para aguar o raciocnio em Shell Script, faa um
backup do script feito acima e adicione as funes pedidas abaixo.

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

Agora eu quero dizer que B Ficando assim: Eu posso trocar o B de lugar


menor que A (ou A maior que com o A? Ficaria a mesma
B). Ento s inverter a lgica. coisa!

O comando que apresentarei


no podemos inverter os lados.
Entendendo o comando e criando loops limitados

Sintaxe
Os parnteses estaro sempre desta forma

Os cdigos que ficaro rodando no loop ficam aqui dentro

Aqui fechamos o for com o done

Continuando com a sintaxe

Aqui estou usando uma varivel chamada loop


Pode ser o nome de varivel que voc quiser.
Fecha a
Abre a Condio
Condio

As 3 partes que sero explicadas a seguir, sempre


sero separadas por ponto e vrgula sem espao.

Diminui ou aumenta o valor


Dando um valor
da varivel a cada rodada
para a varivel loop
varivel++ ou varivel--

Aqui a chave do negcio, ele d uma condio enquanto


ela for verdadeira o loop vai rodando, neste caso
enquanto varivel loop for menor que 3 ele vai executando.

A traduo do comando for:

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.

interessante voc colocar o comando:


echo $loop (dentro do for) para ir
vendo na tela quantos loops dar

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

Usamos o mesmo conceito neste for, a diferena que o usurio digita os


parmetros (quantos quiser). Ele digita o comando do script, espao, depois os
parmetros. ./script parmetro1 parmetro2 parmetro3 ...

Veremos o conceito de parmetros futuramente, ele tem utilidade


no script como um todo e no somente no for.
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:
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.

Alguma duvida de como o script funciona ?


Veja o vdeo com ele rodando, no link abaixo
http://www.mediafire.com/download/7ceth5ukcc4c5vq/video_exercicio_4.ogv

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.

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).

Mesmo sendo um valor numrico


ns damos este valor usando aspas
Condio: Enquanto VOLTA for menor que 5 faa o comando

Comando dentro do loop


Aqui eu somo +1 para contar mais um loop dado: varivel $VOLTA
igual ao valor de $VOLTA +1
Fechando o while

Este script diz:


- Volta igual a zero
- Enquanto $VOLTA for menor que 5 faa o comando
- Adicione +1 na varivel VOLTA
Um exemplo prtico foi o que usei no proteccontinuo, eu perguntava ao usurio quantos
players ele desejava adicionar no programa e quando o script fosse criar os players ele pegava a
varivel que usei com o usurio, ento se o usurio respondeu 3 o while dava 3 loops, repetindo o
comando dentro do while 3 vezes e consequentemente criando o proteccontinuo para 3 players.
Texto
Podermos pegar textos para dar voltas no while usando a sada de um comando por
exemplo, eu fao um programa de verificao e enquanto a sada deste comando for determinada
palavra o while vai rodando at que ela mude e saia do loop. As variaes so infinitas, mais para
frente aprenderemos a filtrar textos/sadas de uma forma que possamos resumi-los a uma linha, uma
palavra etc.
A seguir usaremos um loop que dar voltas e voltas at que o usurio decida passar adiante.

Garantindo que entrar no loop, poderamos perguntar isto ao usurio tambm

O script poder fazer algo que s o usurio pode decidir quando prosseguir,
ento ele responde continuar e o while automaticamente sair do loop.

importantssimo entender que o movimento para tirar o while ou until


do loop deve estar dentro dele, seno rodar para sempre.

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:

At que $VOLTA seja maior que 5 ento faa o


comando. Ele vai rodando at que a condio
se torne verdadeira, ou seja, at $VOLTA ser
maior que 5.

As suas voltas sero: 0, 1, 2, 3, 4 e 5


Exerccio 5 Pedindo senha ao usurio

O que o script faz:

- D boas vindas A senha pode ser 123


- Pede senha ao usurio
- A senha sendo correta ele executa o comando echo senha correta e sai
- Caso contrrio o usurio tenta novamente sem sair do script (loop)
- So at 5 tentativas e depois das 5 o script mostra tentativas esgotadas e sai

O desafio aqui a lgica e saber quais comandos colocar dentro do loop.

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:

Ou usando o sinal de menos (esquece multiplicao e diviso nesta sintaxe)

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 E aqui como um texto, colocando aspas na


condio como um valor matemtico varivel e item a ser comparado

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

Basta colocar o endereo do script no arquivo-texto etc/rc.local


Exemplo:
/etc/meu_script
Inicializando com usurio especifico:
sudo -u usurio /etc/script

Tambm podemos programar o script para executar em determinados dias e horrios.

Sempre deixe a ultima linha Cron


do crontab vazia /etc/crontab
service cron restart
Editamos o arquivo /etc/crontab levando em considerao os campos abaixo.
Campo Funo Preenchimento
1 Minuto 0-59
2 Hora 0-23
3 Dia do Ms 1-31
4 Ms 1-12
5 Dia da Semana 0 Domingo, 1 Segunda ...
6 usurio root luiz etc.
7 Programa para execuo Comando
*O 6 campo pode ser omitido, mais evite fazer isto, porque costuma dar pau
Ficando assim 20 10 2 12 2 luiz /home/luiz/meu_script
Do comando gerado acima podemos entender aos 20 minutos das 10 horas do dia 2 de dezembro
numa tera feira o usurio luiz executar o meu_script que est em /home/luiz

Referncia do Cron: http://www.hardware.com.br/dicas/cron.html


Captulo 10 Comando Case
muito mais fcil criarmos menus com um comando prprio, na programao ns temos o
case que facilita em muito a construo destas estruturas, com ele podemos colher dados de uma
varivel que indicar qual opo o case deve executar.

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).

Depois de adicionar todas as linhas daquela opo devemos colocar no final do


ultimo comando ponto e virgula duas vezes para fech-la.

Aqui fechamos o case escrevendo ele ao contrario

Exemplo na prtica

Mostrando o menu para o usurio

Colhendo o valor da varivel e abrindo o case

Repare que na opo 4 temos dois comandos, o ponto e virgula s


consta no ultimo comando

Aqui eu coloquei a opo *, ou seja, se o usurio digitar algo que


no consta nas opes ele cai aqui
No existem limites na quantidade de linhas que colocaremos nas opes, eu j cheguei a
colocar verdadeiros scripts dentro de cada uma.
isto, no temos muito o que falar do case, com ele basta criarmos condies para que a
varivel receba algum valor antes de execut-lo e sempre repetir sua sintaxe:

- Abertura do comando case varivel_usada in


- Opes que ficam antes dos parnteses nmero_ou_texto)
- Terminando os comandos da opo, colocar ponto e vrgula 2 vezes no final do ltimo comando
- Fech-lo escrevendo case ao contrrio esac

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)

Exerccio 6 Pequeno desafio de lgica

A varivel recebe um nmero digitado pelo usurio

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.

Exemplo de como deve aparecer na tela:

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

O papel da funo segmentar vrios cdigos no scripts tornando-os acessveis a qualquer


momento e em qualquer parte, usar a funo como colocar vrios scripts num s script. Um
exemplo prtico disto o protec onde eu tinha muitas opes a serem executadas de vrias partes do
script (o case no resolveria).

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.

Chama a funo instala

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.

Ou na prtica abaixo eu tenho o script back que em seu cdigo d um cp (copiar) no


primeiro parmetro e cola no segundo.

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

Endereo com vrios sites tutoriais de Shell Script

http://aurelio.net/shell/
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.

O script anterior demonstra o funcionamento dos parmetros, se o usurio digitar o comando


do script e ao lado colocar Linux, ento ser executado o comando echo mostrando a palavra
Linux, se ele digitar Linux e livre sero 3 parmetros e o shell executar o echo at o terceiro
parmetros, e assim sucessivamente.

Para mais de 9 parmetros usaremos a dica do Larcio de Sousa do G+

Para declarar mais de 10 parmetros no shell, basta colocar sua expanso entre chaves:

${10}
${11}
${12}

E assim sucessivamente

As aplicaes so infinitas, eu poderia usar o valor de um parmetro para determinar a


quantidade de loops, para colher um nome de usurio, para receber valores a serem calculados etc.
O script abaixo por exemplo, dorme com o tempo determinado pelo usurio e depois mata o
programa tambm com a indicao do usurio.

O usurio daria um comando parecido com este ./script 100 firefox

Tratamos os parmetros como as variveis, s tendo em mente que o seu valor


ser dado pelo usurio antes de iniciar o script
Exerccio 7 Funo e parmetro no mesmo script

- O usurio entra no programa utilizando o seu nome como parmetro


- Aparecer a tela de boas vindas constando o nome deste usurio
- Ele faz um cadastro (poucos dados s para simular, cpf obrigatrio)
- Ele jogado para a segunda parte (de compra), nesta parte pedido o cpf novamente e se o
mesmo estiver errado (de acordo com o que foi cadastrado), o script volta para cadastrar o cpf
novamente

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.

Para mostrarmos somente determinada linha damos o comando:

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.

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: Como so 3 linhas poderamos usar o


comando de incluir e chegaramos no
mesmo resultado, mas s exemplo.
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 | cut pedindo o 2 campo | sed -n '3p' mostrou a linha 3
mouse:azul:novo azul preto
carro:branco:usado branco
radio:preto:novo 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.

Exemplo simples: Pipeline

No exemplo acima eu precisava zerar os arquivos-texto responsveis pelo loop e no fazia


muito sentido usar vrias linhas para isto, ento coloquei todos concatenados na mesma linha
usando o pipeline. (mais tarde eu descobri que no precisava usar arquivo-texto para o loop rsrs)

Exemplo mais avanado:

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

Comando Palavra ou carcter a ser substitudo O que vai entrar no lugar


tr ['a,e'] ['4,3']

importante no deixar espaos dentro dos colchetes para funcionar


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


cat texto | tr a-z A-Z cat texto | tr A-Z a-z

Elimina o que tem entre aspas do texto (aqui elimina espaos)


cat texto | tr -d " "

O cdigo abaixo um exemplo de como podemos pedir um valor ao usurio e transform-lo


do jeito que quisermos, aqui passo tudo que esta maisculo para minsculo. Se o usurio digitar
CASA ento o valor da senha passar a ser casa, se ele digitar CAsa ento teremos casa e
assim por diante.

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 Comando grep Palavra a ser filtrada


pipeline para concatenar

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

Mostrando apenas as linhas onde constam a


palavra gnome

E muito mais resultado para baixo

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

Comando que colhe os dados + pipeline Comando wc contando as linhas


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:

Usando a opo -n temos a classificao numrica:

Eliminando a sada dos comandos

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.

Direcionamos para o > /dev/null

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.

Exerccio 9 Configurando o Samba


Vamos criar um script que automatiza a configurao do samba (programa que compartilha
arquivos entre linux-windows linux-linux), facilitando assim a vida do usurio.

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

[arquivos] # Nome que ser exibido para o diretrio em questo


path = /home/luiz # Pasta compartilhada
read only = no # D permisso de escrita (no default)
public = yes # Permisso para convidados ( necessrio que o usurio esteja adicionado no samba)
Acima os itens em azul sero dados pelos usurios (atravs de variveis) e o restante sero fixos
Caractersticas do programa Ateno, quando for verificar se o samba est instalado voc
- Instala o samba se necessrio dever se referir a ele como smbd
- Explica que o programa cria um compartilhamento publico.
- Menu 1- Nova configurao 2- Adicionar novo diretrio 3- Adicionar novo usurio
- Pergunta ao usurio nome da rede, diretrio a ser compartilhado e o nome que aparecer
- Renomeia o smb.conf atual criando um backup
- Escreve o novo smb.conf usando as informaes dadas pelo usurio
- Pergunta e adiciona usurios de outras mquinas (#adduser usurio e #smbpasswd -a usurio)
- E pergunta e adiciona o usurio local ao samba (#smbpasswd -a usurio)
- Reinicia o samba ( sudo service nmbd restart e sudo service smbd restart )
- Avisa que em breve o compartilhamento j estar ativo e sai
Visualize a imagem abaixo para no errar na hora de imprimir os dados no smb.conf:

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

De qualquer forma voc entendendo seus cdigos o que importa.


Captulo 15 Script com janelas
Script com janelas

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.

Apenas o --tipo ser modificado na sintaxe abaixo, o resto padro

dialog --tipo 'texto' altura largura

A seguir vamos conhecer alguns tipos de janelas

msgbox (caixa de mensagem)

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

Saindo assim no terminal:

Infobox (caixa de informao)

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.

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

Para usar a resposta no script devemos utilizar a varivel $? (leia abaixo)


Exatamente deste jeito, bastando mudar os comandos internos:

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:

gauge Barra de porcentagem


checklist Mostra um menu para escolhas multiplas
menu Menu para a escolha de apenas 1 item
calendar Mostra um calendrio para o usurio escolher uma data
fselect Digita ou seleciona um arquivo
passwordbox 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 2 Script mais elaborado

#!/bin/bash

echo "Ol, abaixo os carros disponveis neste ms"


echo
echo "Ferrari, Palio, Celta, Lamborghini e Uno"
echo

# Recebendo o valor do carro desejado


echo "Qual carro deseja saber a classe? (digite em minsculo)"
read CARRO
echo

# Se carro igual a lamborghini ou a ferrari, ento s pode ser classe A


# Coloquei a varivel no texto, assim o que ele digitar vai aparecer no texto
if [ "$CARRO" = "lamborghini" -o "$CARRO" = "ferrari" ];then
echo "$CARRO pertence a classe A"
fi

if [ "$CARRO" = "celta" ];then


echo "$CARRO pertence a classe B"
fi

if [ "$CARRO" = "palio" -o "$CARRO" = "uno" ];then


echo "$CARRO pertence a classe C"
fi

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

# if de erro para o PC2


if [ "$PC2" != "ligado" -a "$PC2" != "desligado" ];then
echo "Estado invalido para PC2, 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

# INCREMENTO, mostrando o resultado quando dois pcs estiverem DESLIGADOS


if [ "$PC1" != "ligado" -a "$PC2" != "ligado" ];then
echo "Valor da amostra igual a zero"
fi

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
Exerccio 6 Pequeno desafio de lgica

#!/bin/bash

# Aqui eu pego o valor da varivel para ser multiplicado


echo "Por favor digite o nmero a ser processado"
echo
read NUM

# Determinando um valor para a varivel do while


VOLTA=$"1"

# Criando o loop, assim vamos rodar o case 3 vezes

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

# Somando os nmeros de voltas do while, fora do case logicamente


VOLTA=$[ $VOLTA + 1 ]

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"

# Colhendo os dados do cadastro


echo
echo "Digite o nome da sua cidade"
read CIDADE
echo
echo "Digite seu CEP"
read CEP
echo

# Funo que cadastra o CPF


CADASTRO(){
echo "Digite seu CPF"
read CPF
echo
echo "Cadastro finalizado com sucesso"
LOGANDO # Agora chamamos a funo de logar
}

LOGANDO(){

echo
echo "Digite seu CPF para logarmos"
read CPF2
echo

# Aqui comparo os CPFs como texto


if [ "$CPF" = "$CPF2" ];then # Se CPF digitado anteriormente igual ao agora, ento logue
echo "logado com sucesso"
sleep 5
exit # Depois de dormir 5 segundos ele sai porque j alcanamos os nossos objetivos
else # Seno for igual durma e chame CADASTRO, para recebermos o cpf novamente
echo "CPF incorreto, porfavor tente novamente"
sleep 3 # Dando uma dormida para dar tempo do usurio ler a mensagem de erro
CADASTRO
fi
}

# 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

# Renomeando o arquivo de configurao para escrevermos um novo


mv /etc/samba/smb.conf /etc/samba/BKsmb.conf

# Escrevendo o novo smb.conf


echo "[global]" > /etc/samba/smb.conf # Zerando ou criando o arquivo
echo "workgroup = $REDE" >> /etc/samba/smb.conf
echo "name resolve order = lmhosts wins bcast hos" >> /etc/samba/smb.conf

echo "" >> /etc/samba/smb.conf # Escrevendo uma linha de espao

echo "[$NOME_DIR]" >> /etc/samba/smb.conf


echo "path = $DIRETORIO" >> /etc/samba/smb.conf
echo "read only = no" >> /etc/samba/smb.conf
echo "public = yes" >> /etc/samba/smb.conf

# Loop que adiciona usurios de outro PC


echo
echo "Algum usurio de outra mquina vai usar este compartilhamento? s/n"
read MAIS
while [ "$MAIS" = "s" ];do
echo

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

service nmbd restart > /dev/null


service smbd restart > /dev/null

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 "" >> /etc/samba/smb.conf # Escrevendo uma linha de espao

echo "[$NOME_DIR]" >> /etc/samba/smb.conf


echo "path = $DIRETORIO" >> /etc/samba/smb.conf
echo "read only = no" >> /etc/samba/smb.conf
echo "public = yes" >> /etc/samba/smb.conf
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

Você também pode gostar