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)

&

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

echo texto >> /home/luiz/arquivo

* 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

addgroup usuario grupo ou addgroup nomedogrupo

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

tar -zcf novo.tar.gz pasta_ou_arquivo


tar -zxf pasta_ou_arquivo

Compactar
Descompactar

Descrio
z=zip c=compact f=file
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

rar a novo.rar arquivo

Compacta

unrar arquivo.rar

Descompacta

Descrio
a = Adiciona

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
echo Digite o nome do aluno
read ALUNO
Onde read o comando para que o usurio
digite o valor da varivel em questo

O Linux case sensitive, ou seja,


se escreveu determinada varivel
em maiscula, voc no pode
mudar para minuscula no meio do
Script, porque ele reconhece como
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.
O que podemos entender como verdadeiro e falso?
A frase abaixo, por mais obvia que seja, ela verdadeira:
4 menor que 5

Estes operadores so
fundamentais em
scripts/programao.

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

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
- Comando Qualquer comando do shell e quantos voc quiser
fi
- 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
mkdir $USUARIO
fi

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

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

Verdadeiro

Porque as duas condies so verdadeiras

Falso

falso porque apenas uma condio atende

Falso

falso porque apenas uma condio atende

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

Juliana

Entrada permitida (as duas condies so verdadeiras)

Paulo

Juliana

O nome Juliana bate mas o nome Paulo no atende, barrados !

Csar

Mnica

O nome Csar est na lista mas o nome Mnica no, barrados !

Jlio

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
Comando (wondershaper eth0 400 que igual a 50k )
fi

Para o conector E, basta lembrar:


se tudo verdadeiro ento executa.

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

Porque pelo menos uma condio verdadeira

ou

Verdadeiro

Temos uma condio verdadeira, e suficiente

ou

Verdadeiro

Temos uma condio verdadeira, e suficiente

ou

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

Paulo

ou

Juliana

Entrada permitida, pelo menos uma condio verdadeira (juliana)

Csar

ou

Mnica

Entrada permitida, a condio (Csar) valida a entrada

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:
- Informar os carros disponveis ao usurio
- Pede ao usurio que digite qual carro deseja ver a classe
- Mostra a classe do carro e sai

Aqui no vale opo numerica


o usurio deve digitar o nome
do carro, para alcanarmos
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.

PC1

PC2

10

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


aprendemos ela ainda, voc vai fazer a soma de cabea e colocar o
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:
menor que A (ou A maior que
B). Ento s inverter a lgica.

Eu posso trocar o B de lugar


com o A? Ficaria a mesma
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
Condio

Abre a
Condio

As 3 partes que sero explicadas a seguir, sempre


sero separadas por ponto e vrgula sem espao.
Dando um valor
para a varivel loop

Diminui ou aumenta o valor


da varivel a cada rodada
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
da varivel loop 0, 1 e 2
E a cada rodada acrescente + 1.
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:
$HOME ou /home/$USER

Funcionamento

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
Da mesma forma que o if, no while e until usaremos os
operadores lgicos de comparao ensinados no cap. 3

while [ Condio ];do


comando
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
comando
done

Podemos ter mais de uma condio tanto no while quanto no until


usando os conectores E e OU apresentados no cap. 5

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
condio como um valor matemtico

E aqui como um texto, colocando aspas na


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
do crontab vazia

Cron
/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
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

-f mais nmero do campo a ser


mostrado

Aqui mostro o carcter que determina o


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

Exemplo simples:

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
pipeline para concatenar

Comando grep

Palavra a ser filtrada

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


dever se referir a ele como smbd
- Instala o samba se necessrio
- 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
echo "Voc pode instalar o navegador mais tarde"
exit
fi

Zero corresponde a sim

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