Computadores e Sociedade
Software Livre
GNU/Linux
parte2
Prof. Jefer - [email protected]
people.ufpr.br/~jefer
Prof. Jefer Benedett Dörr
www.profjefer.wordpress.com
[email protected]
● Coordenador do curso de Licenciatura em
Computação - UFPR Setor Palotina
● Mestre em Informática - UFPR
● Especialista em Software Livre com ênfase
em Redes - UNIPAN
● Bacharel em Informática - UNIOESTE
Etapa 5
Administração
do Sistema
mcedit
nano
pico
vi
vim
emacs
Editores de texto
useradd: apenas cria o usuário;
adduser: cria usuário automatizado;
passwd: altera a senha;
usermod: modifica uma conta;
userdel: remove usuário e arquivos;
deluser: remove apenas o usuário;
Criação e administração de usuários
groupadd: adiciona grupo ao sistema;
gpasswd: grava senha para o grupo;
groupdel: remove o grupo do sistema;
chage: configura expiração da conta;
chage -E 2016-12-25 jefer
Criação e Administração de grupos
Gerenciamento de Permissões
drwx------ ... 2 jefer ............. 512 Jan ... 29 23:30 .. Arquivos/
-rw-rw-r-- ... 1 jefer ....... 280232 Dec .. 16 22:41... notas.txt
r => significa permissão de leitura (read);
w => significa permissão de gravação (write);
x => significa permissão de execução (execution);
- => significa permissão desabilitada.
Permissão
Binário
----x
-w-wx
r-r-x
rwrwx
000
001
010
011
100
101
110
111
Decimal
0
1
2
3
4
5
6
7
A ordem em que as permissões devem aparecer é rwx.
Sendo assim, vamos entender a string do nosso exemplo
dividindo-a em 4 partes:
Drwx------ é um diretório (d);
- o proprietário pode alterá-lo, gravá-lo e executá-lo (rwx);
- o grupo não pode pode alterá-lo, gravá-lo, nem executá-lo (- - -);
- os demais usuários não podem alterá-lo, gravá-lo, nem executálo (- - -).
chmod:
$ chmod 755 leiame.txt
$ chmod u=rwx, go=rx leiame.txt
$ chmod +x shell.sh
chmod
Chown altera dono e grupo
$ chown jefer.posutfpr leiame.txt
$ chowm .posutfpr leiame.txt
$ chown -R jefer /home/jefer
chown
chgrp altera o grupo;
$ chgrp -R users /home
chgrp
Instalação e gerenciamento de pacotes
O APT busca em /etc/apt/sources.list por sua lista de
origens (sources)
http://www.debian.org/doc/manuals/apt-howto/index.pt-br.html
apt
Atualizando seu cache de pacotes local
Toda vez que você quiser instalar ou atualizar um aplicativo,
você primeiramente, deverá
atualizar seu cachê de pacotes. Isso assegura que você tenha
as últimas informações
sobre o aplicativo que você está instalando.
prompt$ apt-get update
Vendo os pacotes disponíveis
O utilitário apt-cache permite a você buscar no cachê de
pacotes local por pacotes que
contém certos textos.
prompt$ apt-cache search apache
Este comando retornou 119 pacotes na minha máquina.
Em vez de ler todas as entradas, pode-se filtrar os
resultados usando o comando grep
$ apt-cache search apache | grep "^apache"
Ver informações de um pacote prompt
$ apt-cache show nomedopacote
Instalar um pacote
$ apt-get install nomedopacote
Removendo um pacote
$ apt-get remove nomedopacote
Mantendo seu sistema atualizado
$ apt-get update
$ apt-get upgrade
dpdddDD
DPKG
O dpkg complementa o apt-get, permitindo instalar pacotes .
deb baixados manualmente.
Digamos que você tenha baixado, por exemplo, o arquivo
"skype_1.2.0.18-1_i386.deb", o pacote com o Skype,
disponível no http://skype.com.
Para instalá-lo, você usaria o comando:
# dpkg -i skype_1.2.0.18-1_i386.deb
/dev/hdX ou /dev/sdX
fdisk: criar, listar, alterar e apagar partições; fdisk
/dev/sda
mkfs: formata as partições; mkfs -t vfat -I /dev/sdb
mkswap: prepara a partição para trabalhar como swap;
df: capacidade utilizada do disco;
du: utilização do disco;
fsck: checa e corrige erros;
/etc/fstab
Gerenciamento de partições
Volumes lógicos (LVM)
cat /proc/swaps
free -ht s1
cat /proc/sys/vm/drop_caches
Limpar: sysctl -w vm.drop_caches=1
SWAP
mount [opções] [dispositivo] [ponto_de_montagem]
● -a : monta todos os sistemas de arquivos especificados no arquivo
/etc/fstab.
● ro - monta somente como leitura;
O arquivo /etc/mtab possui a lista de todos os sistemas de arquivos
atualmente montados no Linux.
O comando mount sem parâmetros faz o sistema listar o conteúdo do
arquivo /etc/mtab.
● umount - desmonta sistemas de arquivos.
Montagem e desmontagem de
tar
$ tar -cvf <arquivo_final> <origem>
-c: create
-v: verbosa
-f: será definido nome do arquivo final
<origem>: arquivo ou diretório que será
compactado
Exemplos:
$ tar -cvf teste.tar *
Compactação e descompactação de arquivos
tar
$ tar -cvf /tmp/gifs.tar /var/www/htnl/*.tar
Descompactar: (-x descompacta o arquivo f)
$ tar -xvf arquivo.tar
Outras opções: (gzip/gunzip, tar+gzip, tar+bzip)
$ ping
$ ifconfig : ifconfig eth0 down : ifconfig eth0 10.0.0.1 netmask
255.0.0.0
$ ifup / ifdown : ativa ou desativa a interface de rede definada
em /etc/network
$ route: route add default gw 10.0.0.100 : route del default gw
10.0.0.100
$ dhclient eth0: solicitar dados de rede
Comandos para gerenciamento de redes
$ mii-tool: negociação de link de rede
$ ethtool eth0
$ linx/links/elinks/links2 : navegadores
$ wget: download de arquivos
$ netstat: -tunap
$nmap
$ whois: dados sobre domínios
$ geoiplookup: localização geográfica do ip
$ iptraf: tráfego de rede
$ ethstatus -i eth0
$ ipcalc 192.168.1.0/255.255.255.0
$ dig www.utfpr.br.edu (dnsutils)
$ tcpdump: analisar de tráfego: tcpdump -nAi eth0 udp
$ hostname
adduser
useradd
userdel
passwd
su
sux
w
whoami
Gerenciamento de Contas
cat
tail
head
nano
mcedit
md5sum
dd
which
detox
df
du
durep
mkdir
rmdir
cd
pwd
ls
stat
rm
wipe
cp
mv
find
locate
chmod
chown
ln
diff
cmp
touch
file
tree
Gerenciamento de Arquivos/Diretórios
Memória
free
memstat
pmap pid
top
htop
iotop
stress
Processos
ps
kill
killall
jobs -l
bg
fg
time
nohup
strace (strace -c ls /home)
renice
nice
ionice
fuser .
renice +19 1000 -u jeferl
nice -n -5 ntpd
lsof -u user
Gerenciamento de Processos
cron
15 23 * * * /sbin/reboot
$ crontab -l
0 0,12 * * 1-3 /sbin/reboot
$ crontab -r
*/10 * * * * /sbin/reboot
$ crontab -e
sintaxe: minuto hora dia_do_mês mês dia_da_semana /path/comando
Agendamento de Tarefas
Diretórios de agendamento
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly
a=`df -h | grep sda6 |
cut -d"%" -f1 | tr -s " " |
cut -d " " -f5`
if [$a -gt 80] then echo
" hd com $a" fi
Etapa 6
Shell
Script
1.
2.
3.
4.
5.
6.
Introdução
Instalação
Virtualização
Comandos básicos
Administração do Sistema
Shell Script
jefer@acer:~$ cor=azul
jefer@acer:~$ echo cor
Cor
jefer@acer:~$ echo $cor
azul
Iniciando
#!/bin/bash
echo 'Nossa!
Estou vivo!'
Tornemos então o arquivo executável:
chmod +x arquivo.sh
Ou chmod 755 arquivo.sh
Para executar: ./arquivo.sh
Se você der o comando "ps", vai ver que um dos programas
rodando é o seu shell:
jefer@acer:~$ ps
PID TTY TIME CMD
164 tty2 00:00:00 bash
213 tty2 00:00:00 ps
jefer@acer:~$
Ou seja, o shell utilizado nesse console é o bash, que está rodando
com PID 164.
bash
Quer exemplos?
file /usr/bin/* | grep shell
Onde tem shell?
É muito perigoso estudar shell usando o superusuário, você
pode danificar o sistema com um comando errado.
Se você não tem certeza qual o seu usuário, use o comando
"whoami" para saber
Shell
A primeira linha de todo shell script deve começar com algo do
tipo: #!/bin/bash , a qual indica com qual shell deverá ser
executado o script.
Bourne Shell (sh)
Korn Shell (ksh)
Boune Again Shell
(bash) *
C Shell (csh)
Formato de Arquivos
Algumas variáveis já são predefinidas no shell, como o PATH, que
armazena o caminho dos programas. Por exemplo, a minha
variável PATH contém:
jefer@acer:~$ echo $PATH
/usr/local/bin:/usr/bin: /bin: /usr/X11R6/bin: /usr/openwin/bin:
/usr/games: /opt/kde/bin: /usr/share/texmf/bin: /etc/script
É importante destacar que o shell possui várias variáveis prédefinidas, ou seja, que possuem um significado especial para ele,
entre elas: PATH, PWD, PS1, PS2, USER e UID.
Para conhecer mais variáveis de ambiente digite:
env
Variáveis de Ambiente
Variáveis
Prompt$ HOJE=$(date)
echo "Hoje é: $HOJE"
Sáb Abr 24 18:40:00 BRT 2004
unset HOJE
echo $HOJE
$ variavel="Eu estou logado como usuário $user"
$ echo $variavel
Eu estou logado como usuário cla
$ variavel='Eu estou logado como usuário $user'
$ echo $variavel
Eu estou logado como usuário $user
$ variavel="Meu diretório atual é o `pwd`"
$ echo $variavel
Meu diretório atual é o /home/cla
Parâmetros
Parâmetros
$0 : é o nome do shell script (parâmetro zero);
$1 a $9 : $1 é o primeiro parâmetro, $9 o nono, assim por diante;
${10}, ${11}.. quando o número do parâmetro possui mais de um
dígito é necessário o uso das chaves;
$* : todos os parâmetros em uma única string (exceto o $0);
$@todos os parâmetros, cada um em string separadas (exceto $0);
$# número de parâmetros (sem contar com o $0)
$? valor de retorno do último comando;
$$ PID do script.
Parametros.sh
!/bin/bash
# "basename" serve para eliminar o caminho do arquivo e
mostrar
# somente o último nome dele. Neste caso: parametros.sh
echo "Nome do script: `basename $0`"
echo "Número total de parâmetros: $#"
echo "Primeiro parâmetro: $1"
echo "Segundo parâmetro: $2"
echo "Décimo quinto parâmetro: ${15}"
echo "Todos os parâmetros: $*"
$ ./parametros.sh a b c d e f g h i j l m n o p q r s t u v
xz
Nome do script: parametros.sh
Número total de parâmetros: 23
Primeiro parâmetro: a
Segundo parâmetro: b
Décimo quinto parâmetro: p
Todos os parâmetros: a b c d e f g h i j l m n o p q r s
tuvxz
find / -name file -print
#!/bin/bash
find / -name $1 -print
#o bash lê a variável "$1",
ele a substitui pelo primeiro
parâmetro passado na linha
de comando para o nosso
script.
Passagem de Parâmetros
#!/bin/bash
echo "Vou buscar data do sistema. Posso
continuar? [sn] " ; read RESPOSTA; test
"$RESPOSTA" = "n" && exit
echo "Data e Horário:" ;date
;
#!/bin/bash
read -p 'Qual foi sua nota na Prova?' nota
if test -n "$nota"
then
if test "$nota" -gt 7
then
echo "voce esta aprovado!"
else if test "$nota" -eq 10
then
echo "show! gabaritou!"
else if test "$nota" -ge 2 && test "$nota" -lt 5
then
echo "reprovado!"
else if test "$nota" -lt 2
then
echo "assinou o nome?"
else
echo "voce apenas passou!"
fi ;fi ;fi ; fi ; fi
Exemplo IF
test
#!/bin/bash
echo "Vou buscar os dados do
sistema. Posso continuar? [s/n] "
read RESPOSTA
test "$RESPOSTA" = "n" && exit
echo "Data e Horário:"
date
echo "Uso do disco:"
df
echo "Usuários conectados:"
w
Interagindo c/ test
O test pode apenas comparar strings, ou seja, verificar se uma é
igual a outra, e verificar se uma string é vazia ou não. Vamos
aos exemplos para facilitar o entendimento:
jefer@acer:~$ test "a" = "a"
jefer@acer:~$ echo $?
0
jefer@acer:~$ test "a" = "b"
jefer@acer:~$ echo $?
1
jefer@acer:~$ test "a" != "b"
jefer@acer:~$ echo $?
Expressões usando strings:
0
jefer@acer:~$ test -z neo"
jefer@acer:~$ echo $?
1
jefer@acer:~$ test -z ""
jefer@acer:~$ echo $?
0
jefer@acer:~$ test -n
“neo"
jefer@acer:~$ echo $?
0
jefer@acer:~$ test -n ""
jefer@acer:~$ echo $?
1
Ao lado temos os testes de
vazio. A opção "-z" verifica se é
vazio, e "-n" se não é vazio.
No primeiro caso, ele testa se
"neo" é uma string vazia,
retornando falso.
No segundo caso, como "" é
vazia, retorna verdadeiro.
O terceiro e quarto são
semelhantes aos primeiros,
mas com "-n".
Os testes que podem ser feitos com arquivos são para
verificar determinadas caracteristicas, como se ele existe, se
é executável, se é um link simbólico, se é um diretório etc.
Alguns exemplos:
A opção "-e" verifica apenas se um arquivo existe e a opção "d" verifica se o arquivo é um diretório.
A opção "-nt" verifica se o primeiro arquivo é mais novo que o
segundo (nt = newer than) e "-ot" verifica se o primeiro é mais
velho que o segundo (od = older than):
Expressões com arquivos:
jefer@acer:~$ test -e vmlinuz
jefer@acer:~$ echo $?
0
jefer@acer:~$ test -d vmlinuz
jefer@acer:~$ echo $?
1
jefer@acer:~$ test -e /usr
jefer@acer:~$ echo $?
0
jefer@acer:~$ test -d /usr
jefer@acer:~$ echo $?
0
jefer@acer:~$ test /usr -nt /vmlinuz
jefer@acer:~$ echo $?
0
jefer@acer:~$ test /usr -ot /vmlinuz
jefer@acer:~$ echo $?
1
A seguir, uma lista de várias opções disponíveis:
* -b arquivo - Verdadeiro se arquivo é um arquivo de bloco,
como /dev/hda.
* -c arquivo - Verdadeiro se arquivo é um arquivo de caracter,
como /dev/tty1.
* -d arquivo - Verdadeiro se arquivo é um diretório.
* -e arquivo - Verdadeiro se arquivo existe.
* -f arquivo - Verdadeiro se arquivo existe e é um arquivo
comum.
* -s arquivo - Verdadeiro se arquivo existe e não é vazio.
* -h arquivo - Verdadeiro se arquivo é um link simbólico.
* -p arquivo - Verdadeiro se arquivo é um "named pipe" (fifo,
lifo, etc).
* -S arquivo - Verdadeiro se arquivo é um "socket".
* -r arquivo - Verdadeiro se arquivo pode ser lido pelo
usuário atual.
* -w arquivo - Verdadeiro se arquivo pode ser escrito
pelo usuário atual.
* -x arquivo - Verdadeiro se arquivo pode ser executado
pelo usuário atual.
* -O arquivo - Verdadeiro se arquivo pertence ao
usuário atual.
* -G arquivo - Verdadeiro se arquivo pertence ao grupo
do usuário atual.
* -N arquivo - Verdadeiro se arquivo foi modificado
desde a ultima vez que foi lido.
o sinal de & depois de um comando.
Exemplo:
jefer@acer:~$ cp arquivo1 arquivo2 &
[1] 206
A primeira informação ([1]) chama-se job. Ela identifica os
programas que estão sendo executados em bg (background).
A segunda informação (206) é o pid do programa, ou seja, o
número de processo que o kernel dá a esse programa.
Para retornar, usamos o comando fg [job]
Execução em foreground e background
Não são realmente comandos mas são conceitos muito importantes.
pipes (|) envia o output (stdout) de um programa para o input (stdin)
de um outro programa.
cat ficheiro.txt |grep palavra | wc -l
procura as linhas com a string PALAVRA no ficheiro.txt e conta as
linhas.
O output do comando grep é utilizado como input para o comando
wc. Dessa forma você pode concatenar os comandos que queira
Pipes, redirecionamento e backtick
redirecionamento: escreve o output de um comando para
um aruivo ou adiciona dados a um ficheiro:
> escreve o output para um arquivo e sobrepõe o arquivo
antigo caso ele existir
Ex.: echo oi > oi.txt
echo ola > oi.txt
>> adiciona dados a um arquivo (ou cria um novo se ele
ainda não existir mas nunca sobrepõe nada).
Ex.: echo oi >> oi2.txt
echo oii >> oi2.txt
Backtick
O output de um comando pode ser utilizado como
argumento da linha de comandos para um outro
comando. Você pode também utiliza-lo para definir o
output de um comando para uma variável.
O comando:
find . -mtime -1 -type f -print
procura todos os ficheiros que foram modificados nas
ultimas 24 horas (-mtime -2 significaria 48 horas).
Se você quer armazenar esse ficheiros num arquivo
tar (ficheiro.tar) a syntax para o tar teria de ser:
tar xvf ficheiro.tar ficheiro1 ficheiro2 ...
Em vez de escrever isso tudo, você pode combinar 2
comandos (find e tar) utilizando backticks. Tar irá
arquivar todos os ficheiro que find escreveu:
#!/bin/sh
# Backticks (`) , não plicas ('):
tar -zcvf ultimamod.tar.gz `find . -mtime -1 -type f print`
Estruturas de Controle
Desvio e Repetição
Estruturas de Desvio
Condicionais são comandos que avaliam uma expressão. Se
ela for verdadeira, uma determinada rotina é executada. Caso
contrário, outra rotina pode ser executada.
Controle de fluxo com:
If
Case
Select
o comando IF (ele é um comando embutido no bash e não um
programa como o "ls", o "cp" etc.).
A forma mais simples de representar uma condicional utilizando
o IF, é da seguinte forma básica:
if [condição];
then comandos1;
else comandos2;
fi;
Se [condição] for verdadeira, os comandos1 são executados. Se
for falsa, os comandos2 são executados.Mas para o IF, o que é
uma condição verdadeira ou uma falsa?
if
Se [condição] for verdadeira, os comandos1 são executados.
Se for falsa, os comandos2 são executados.Mas para o IF, o
que é uma condição verdadeira ou uma falsa?
TODO comando em Unix tem um código de retorno.
Geralmente o código "0" (zero) significa que o comando foi
executado perfeitamente e terminou bem. Códigos maiores
que zero significam que alguma coisa de errado ocorreu.
É assim que o IF verifica uma condição. Se o seu código de
retorno for zero, então ela é considerada verdadeira. Caso
contrario, ela é falsa.Mas então a [condição] tem que ser um
comando, certo?
Exemplo:
jefer@acer:~$ if ls /boot; then echo "O diretório existe.";
else echo "Diretório inválido."; fi;
System.map boot.0300 boot.b boot_message.txt chain.
b config map os2_d.b
O diretório existe.
O que aconteceu?
Logo após o if, nós colocamos um comando: "ls /boot". O
que o IF faz? Ele executa esse comando (por isso que
temos a segunda linha começada por "System.map", que é
o conteúdo do meu diretório /boot) e avalia o seu código de
saída. Como o "ls" foi executado corretamente, ele retorna
zero, significando verdadeiro para o IF, que executa o
comando logo após o "then", ou seja, o echo "O diretório
existe.", mostrando essa mensagem no console.
Agora vamos colocar um diretório que não existe:
jefer@acer:~$ if ls /dir_invalido; then echo "O diretório
existe."; else echo "Diretório inválido."; fi;
/bin/ls: /dir_invalido: Arquivo ou diretório não
encontrado
Diretório inválido.
A lógica é a mesma. Executa o "ls /dir_invalido", que
retorna um código maior que zero. O IF avalia como
falso e executa o comando após o else: echo
"Diretório inválido"..
if [ -e $linux ]
then
echo 'A variável $linux existe.'
else
echo 'A variável $linux não existe.'
fi
O que este pedaço de código faz? O if testa a
seguinte expressão: Se a variável $linux existir, então
(then) ele diz que que existe com o echo, se não
(else), ele diz que não existe.
geralmente é utilizado como substituição de vários IFs.
Um exemplo clássico e muito utilizado é quando precisa
testar um parâmetro fornecido na linha de comando. O
Case é utilizado desta forma em scripts de inicialização de
serviços do sistema.
Exemplo: um script que inicialize/reinicialize ou pare algum
serviço (como o sendmail, apache, bind, etc).
case
Sintaxe:
case <parâmetro> in
opção 1 )
<comandos 1>
;;
opção2 )
<comandos 2>
;;
*)
< comandos se não for nenhuma das opções >
esac
;;
Explicação:
O Case pega a string fornecida em <parâmetro> e compara
com <opção 1>. Se forem iguais, ele executa <comandos 1>
e sai fora. Caso contrario, ele compara <parâmetro> com
<opção 2> e assim por diante.
Caso <parâmetro> não seja igual a nenhuma das opções, ele
executa os comandos da opção "*", se este existir.
IMPORTANTE: Prestem atenção a alguns detalhes na
sintaxe. Deve existir um ")" após cada opção e também um ";;"
após todos os comandos de cada opção. Vejam o exemplo:
case "$1" in
'start' ) echo "Iniciando o serviço..."
<comandos para iniciar o serviço>
;;
'restart' ) echo "Reinicializando o serviço..."
<comandos para reinicializar o serviço>
'stop' ) echo "Parando o serviço..."
<comandos para parar o serviço>
;;
*)
echo "Opção invalida!"
echo "As opções válidas são:
start, stop e restart"
;;
esac
;;
O Case serve para evitar o teste de vários Ifs. No caso
acima, teríamos que utilizar 3 Ifs. Mesmo se o primeiro já
fosse verdadeiro, o bash iria testar o segundo e o
terceiro, ou seja, ia perder tempo desnecessariamente.
Já no case isso não acontece. Após entrar em uma
opção e executar seus comandos, ele já pula fora do
case sem testar as outras opções abaixo.
O Select é um comando de laço que nos permite
mostrar um pequeno menuzinho de opções para o
usuário. Cada opção possui um número e para
escolher, o usuário digita o número correspondente
a opção desejada. Vejamos a sintaxe a seguir:
select <var> in <lista de opções>;
do
<comandos>
done;
select
o select vai mostrar as opções contidas em <lista de
opções>, uma por linha, com um número na frente e espera
que o usuário digite a opção desejada. Ao digitar a opção, o
select atribui o nome da opção a variável <var> e executa os
comandos. Para sair do select, é necessário executar o
comando "break". Vamos a um exemplo:
select x in Iniciar Reiniciar Parar Sair; do
echo "Opção Escolhida: $x"
if [ "$x" == "Sair" ]; then break; fi;
done;
se o usuário escolher alguma opção diferente de "Sair", o
script apenas escreve a opção. Se for escolhida Sair, ele
mostra a opção, entra no IF e executa o break, saindo do
select.
É interessante combinar o Select com o Case. Vamos
mostrar como ficaria aquele exemplo do case, de iniciar
um serviço, utilizando o Select, para tornar o script
interativo:
select x in Iniciar Reiniciar Parar Sair; do
case "$x" in
'Iniciar' )
echo " Iniciando o serviço..."
;;
'Reiniciar' ) echo " Reinicializando o serviço..."
;;
'Parar' )
echo " Parando o serviço..."
;;
'Sair' )
echo " Script encerrado."
break ;;
*)
echo " Opção inválida!"
;;
esac
done;
Primeiramente o Select mostra um menu:
1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#?
Quando o usuário digitar um número de opção, o select
executa o case e este compara a variável x com suas
opções. Se achar alguma, executa seus comandos, no caso
um echo. Se o usuário escolher Sair, além do echo, ele
executa o "break", que interrompe o select:
neo@matrix:~/test$ ./t
1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#? 1
Iniciando o serviço...
1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#? 5
Opção
inválida!
1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#? 4
Script
encerrado.
neo@matrix:~/test$
Estruturas de Repetição
while
until
for
Ele testa uma condição (como faz o IF) e executa um
conjunto de comandos se esta condição for verdadeira.
Após a execução desses comandos, ele torna a testar a
condição e se esta for verdadeira, ele reexecuta os
comandos e assim por diante.
Sua sintaxe é a seguinte:
while [ condição ];
do
comando 1;
comando 2;
...
done;
WHILE
O parâmetro [ condição ] funciona exatamente igual ao do IF.
Não voltarei a abortar os parâmetros condicionais pois eles já
foram explicados na aula 3. Em caso de dúvida sobre isso,
uma rápida revisão na aula 3 é suficiente.
Bom, vamos ao exemplo mais simples do While: um contador.
x=0
While [ "$x" -le 10 ];
do
echo "Execução número: $x"?;
x = $((x+1));
done;
Analisando:
Na primeira linha temos a condição: enquanto o valor da variável x
( $x ) for menor-igual ( -le ) a 10, faça: mostre "Execução número: "
e o valor de x ($x). Faça x = x + 1. Isso no bash é feito pelo
comando $(( )). Ele realiza operações algébricas com variáveis. No
caso acima, estamos somando x + 1 e colocando o resultado no
próprio x.
Preste atenção, que as linhas do While precisam de um ";" para
terminar, exceto a que contém o "do", pois ele representa o
começo do bloco de comandos.
Quando executamos o script acima, temos uma contagem de 1 até
10:
jefer@acer:~$ x=0; while [ "$x" -lt 10 ]; do x=$((x+1));
echo
"Execução número: $x"; done;
Execução número: 1
Execução número: 2
...
Execução número: 9
jefer@acer:~$
Tem as mesmas características do while, a única
diferença é que ele faz o contrário. Veja o exemplo
abaixo:
variavel="naovalor"
until [ $variavel = "valor" ]; do
comando1
comando2
done
until
Ao invés de executar o bloco de comandos (comando1
e comando2) até que a expressão se torne falsa, o until
testa a expressão e executa o bloco de comandos até
que a expressão se torne verdadeira. No exemplo, o
bloco de comandos será executado desde que a
expressão $variavel = “valor” não seja verdadeira.
Se no bloco de comandos a variável for definida como
“valor”, o until pára de executar os comandos quando
chega ao done.
Um exemplo para o until que, sintaticamente invertido,
serve para o while também:
var=1
count=0
until [ $var = "0" ]; do
comando1
comando2
if [ $count = 9 ]; then
var=0
fi
count=`expr $count + 1`
done
Primeiro, atribuímos à variável “$var” o valor “1″. A variável
“$count” será uma contagem para quantas vezes
quisermos executar o bloco de comandos. O until executa
os comandos 1 e 2, enquanto a variável “$var” for igual a
“0″. Então usamos um if para atribuir o valor 0 para a
variável “$var”, se a variável “$count” for igual a 9. Se a
variável “$count” não for igual a 0, soma-se 1 a ela. Isso
cria um laço que executa o comando 10 vezes, porque
cada vez que o comando do bloco de comandos é
executado, soma-se 1 à variável “$count”, e quando chega
em 9, a variável “$var” é igualada a zero, quebrando assim
o laço until
O for é semelhante ao while usado como um contador.
for <var> in <lista>;
do
comandos
done;
O For associa o primeiro item da lista de nomes à variável
<var> e executa os comandos. Em seguida, associa
novamente o segundo item da lista à <var> e executa
novamente os comandos... e assim por diante, até acabar
a lista.
for
jefer@acer::~$ for x in Compra Venda Aluguel; do
echo $x; done;
Compra
Venda
Aluguel
Ou seja, primeiro ele coloca "Compra" na variável x
e executa os comandos, no caso, "echo $x", e
assim por diante.
Podemos facilmente implementar um contador, usando em
conjunto com o for, o programinha "seq". Ele simplesmente
gera uma seqüência de números. Por exemplo, "seq 10" gera
uma seqüência de 1 até 10. Assim, podemos usá-lo no for:
for x in $(seq 10); do echo $x; done;
Esse comando é semelhante ao contador implementado com
o While. Primeiro o x vale 1 e o for executa os comandos.
Depois x vale 2 e ele reexecuta os comandos...
Vamos usar o For para renomear os arquivo de um
diretório, mudando todos os arquivo terminados em
".mp3" para ".mp3.bak".
for x in *; do
mv "$x" "${x}.bak";
done;
for x in *.mp3; do
if [ -e "$x" ];
then mv "$x" "${x}.bak";
fi;
done;
No local de <lista> nos colocamos "*.mp3". Isso diz ao bash para
expandir (transformar) ele na lista de arquivos terminados com ".
mp3". Senão houver nenhum arquivo com essa terminação, o
bash não faz nada, ficando para o for a string "*.mp3". Por isso
precisamos do IF para testar se o arquivo existe.
Experimente no seu sistema.
echo *.mp3
Vai mostrar os arquivos no diretório atual com terminação mp3,
mas sem quebra de linha entre eles, ou seja, um nome após o
outro. Se não houver nenhum arquivo com terminação mp3, ele
apenas vai mostrar "*.mp3"
Bom, voltando ao For, ele vai atribuir a "x" cada nome na
lista de arquivos com terminação ".mp3" e executar os
comandos seguintes.
Primeiro ele testa para ver se o arquivo existe ( if [ -e "$x" ];
), e se existir, renomeia ele para o seu próprio nome
acrescido de ".bak" ( ${x}.bak ).
Resumindo, o For faz isso: você fornece uma lista de
nomes para ele e ele vai atribuindo esses nomes, em
ordem e um por vez, à variável <var> e executa os
comandos entre o "do" e o "done;".
metacaracteres
São caracteres especiais. Quando eles são digitados são
interpretados de outra forma. Podem ser usados para especificar um
ou uma cadeia de outros caracteres. O shell procura no diretório
corrente arquivos que casem com esse padrão e os expande.
Usando caracteres coringas
Geralmente o caracter "*" é um coringa que significa "qualquer
caracter em qualquer quantidade". Por isso se a gente executar "ls *",
onde "*" entra no lugar do "nome do arquivo", significando qualquer
string de qualquer tamanho. Por isso ele lista todos os arquivos.
Faixas de caracteres também são permitidos:
[0-3] é o mesmo que [0123]
[a-k] é o mesmo que [abcdefghijk]
[A-C] é o mesmo que [ABC]
[A-Ca-k] é o mesmo que [ABCabcdefghijk]
Existem também algumas formas alternativas:
[[:alpha:]] é o mesmo que [a-zA-Z]
[[:upper:]] é o mesmo que [A-Z]
[[:lower:]] é o mesmo que [a-z]
[[:digit:]] é o mesmo que [0-9]
[[:alnum:]] é o mesmo que [0-9a-zA-Z]
[[:space:]] casa com qualquer quantidade de espaços
O grep basicamente faz buscas. Mais precisamente:
grep palavra file
retorna todas as linhas do arquivo file que contenham palavra
Outro jeito de usar o grep é atraves de pipe (lembram dos pipes?).
Por exemplo:
ls | grep palavra
Lista todos os arquivos que contenham palavra em seu nome. Ou
seja, a entrada do grep é uma lista de arquivos (gerada pelo ls)
que será filtrada, sendo impressas somente as linhas que
contenham palavra.
grep
>cat file
file
big
bad bug
bigger
boogy
"." significa "qualquer e apenas um caracter".
Para significar strings arbitrárias utilizamos "*".
Intervalo numerico: ls oi[0-9].txt
Exemplo 1:
>cat file
O gato preto foi caçado por um cachorro
marrom.
>sed -e 's/preto/branco/g' file
O gato branco foi caçado por um cachorro
marrom.
sed
Funções
Funções são blocos de comandos que podem ser definidos para uso posterior
em qualquer parte do código.
sintaxe de uma função:
funcao() {
comando1
comando2
...
}
A função funcionará como um simples comando próprio.
Você executa a função em qualquer lugar do script shell, e os comandos 1, 2 e
outros serão executados. A flexibilidade das funções permite facilitar a vida do
programador, e organizar
Shellzin Gráfico
Xdialog --title "Exemplo número 2!" --stdout --yesno \
"Neste exemplo, vamos ver o que você quer fazer. Você
deseja continuar com o programa?" \
00
if [ $? = "0" ]; then
echo "Que bom! Você continuou o programa! Parabéns!"
elif [ $? = "1" ]; then
echo "Você saiu do programa..."
fi
Shell com janelas
Xdialog --title "Exemplo número 1!" --center --stdout -yesno \
"Isto é legal?" \
00
http://aurelio.net/shell/dialog/
Xdialog --title "Exemplo número 2!" --center --stdout -yesno \
"Neste exemplo, vamos ver o que você quer fazer. Você
deseja continuar com o programa?" \
00
if [ $? = "0" ]; then
echo "Que bom! Você continuou o programa!
Parabéns!"
elif [ $? = "1" ]; then
echo "Você saiu do programa..."
fi
mais janelas
#!/bin/bash
kdialog --msgbox "Olá, tudo bem?"
kdialog --inputbox "Canal a gravar (ex: 12)" 10 60
"12" 2> /tmp/resposta.tmp
canal=`/tmp/resposta.tmp`
kdialog --passivepopup "Esta janela some sozinha
depois de 6 segundos." 6 &
arquivo=`kdialog --getsavefilename
"/home/kurumin/Desktop" \
"*.txt |Arquivos de texto" kdialog
Xdialog --title "Aviso" --center --stdout --msgbox \
"Este programa é apenas um exemplo para você ver como
o Xdialog \
\nfunciona. Apropósito, se você praticar bastante pode
criar \
\nprogra mas incríveis e facilmente, que daria muito mais \
\ntrabalho fazendo em outras linguagens." \
00
mais janelas
dialog --title "Exemplo de Menu" --center --stdout -menubox \
"Qual sua distribuição Linux favorita?" \
20 50 0 \
1 "Slackware" \
2 "Debian" \
3 "Red Hat" \
4 "Conectiva Linux" \
5 "Eu tenho minha própria distribuição"
mais janelas
Xdialog --title "Exemplo de Menu" --center --stdout
--menubox \
"Qual sua distribuição Linux favorita?" \
20 50 0 \
1 "Slackware" \
2 "Debian" \
3 "Red Hat" \
4 "Conectiva Linux" \
5 "Eu tenho minha própria distribuição"
#!/bin/bash
kdialog --msgbox "Olá, tudo bem?"
kdialog --inputbox "Canal a gravar (ex: 12)" 10 60 "12" 2>
/tmp/resposta.tmp
canal=`/tmp/resposta.tmp`
kdialog --passivepopup "Esta janela some sozinha depois de 6
segundos." 6 &
arquivo=`kdialog --getsavefilename "/home/kurumin/Desktop" \
"*.txt |Arquivos de texto"`
#!/bin/sh
#Desenvolvido por Jefer Benedett Dorr ([email protected])
#script para configurar rede do meu note na pos da unipan
kdialog --title "Script Configurador para Rede Unipan" --passivepopup "Aguarde....... Configurando a
rede" 3 #msg passiva no canto superior esquerdo
clear
ifconfig eth0 down
ifconfig eth0 up
echo "iniciando configuração"
ifconfig eth0 192.168.90.117 netmask 255.255.255.0 up
echo "adicionando rota"
route add default gw 192.168.90.1
#adicionar dns no resolv
echo "adicionando dns no resolv.conf"
echo "nameserver 192.168.90.1" >> /etc/resolv.conf
echo "testando conexao..........."
if ping -c 3 www.unipan.br
then echo "Conexão --------- OK "
echo "Conexão Testada ;)"
else echo "Bahh!! Conexão Falhou!"
exemplo
fi
Papo de Botequim – Julio Neves - http://twiki.softwarelivre.
org/TWikiBar
Shell Script: Porque programar tem que ser divertido –
Aurélio Marinho Jargas - http://aurelio.net/shell/
Guia do Hardware – Carlos Morimotto http://www.gdhpress.com.br/ferramentas/leia/index.php?
p=cap4-1
http://lcnsqr.byethost9.com/?
sec=lpic&exam=102&node=13
Sobre Shell
Livros
Filmes
Piratas do
Vale do Silício
Revolution OS
The code
Linux
Simulados
http://www.lpibrasil.com.br/simulados
http://www.vivaolinux.com.br/scripts/download.php?codigo=5156
Show do Milhão:
http://www.fuctura.com.br/jogolpi/
Download

Computadores e Sociedade – GNU_Linux – p2