Universidade Tuiuti do Paraná
Faculdade de Ciências Exatas
Sistemas Operacionais III - CSTR
Shell Script
“Meu Deus do Shell!
Porque eu não optei pelo Linux antes?”1
[1] NEVES, Júlio César
Profº André Luiz
[email protected]
Conteúdo programático
●
Fundamentos de Shell
●
Comandos básicos
●
Principais arquivos/diretórios de configuração
●
Comandos de rede
●
Comandos avançados
●
Tipos de variáveis e atribuição
●
Variáveis de ambiente e variáveis especiais
●
Trabalhando com arquivos de texto
FHS - Permissões - Filtros - SED - Editores de texto
●
Operadores do Shell
●
Estrutura de decisão
●
Laços
●
Funções
●
Expressões regulares
Profº André Luiz
[email protected]
O que é Shell Script?
Shell é uma interface textual que interpreta os
comandos existentes em um sistema operacional
e os envia ao kernel imprimindo posteriormente o
resultado do processamento na tela.
“Embora seja verdade que haja ferramentas GUI
disponíveis para gerenciar praticamente tudo em um
sistema GNU/Linux, você precisa ter conhecimento
sólido sobre utilitários de linha de comando para se
preparar melhor para se trabalhar com qualquer
distribuição Linux.”
(PRITCHARD; PESSANHA; STANGER;
DEAN; LANGFELDT, 2007,P. 53)
O que é Shell Script?
O SHELL original para sistemas UNIX foi escrito por
Steve Bourne e se chamava simplesmente sh. O
SHELL padrão de sistemas Linux é o BASH (BOURNEAGAIN SHELL), que é uma variante GNU de sh.
O que é Shell Script?
Shell, é um interpretador de comandos que analisa
o texto digitado na linha de comando e os executam.
Na linha de comandos de um shell, podemos utilizar
diversos comandos um após o outro, ou mesmo
combiná-los numa mesma linha ( ; && | tee \ ). Se
colocarmos diversas linhas de comandos em um
arquivo texto simples, teremos em mãos um Shell
Script, ou um script em shell.
Existe mais de um Shell?
Exemplos de Shell:
●
csh: É a shell mais utilizada em sistemas como *BSD ou Xenix. A sua
estrutura de comandos é similar á Linguagem C.
●
sh: Ou Bourne Shell é a shell pré-defenida com o Unix (1977). Desde a
versão 7 substituindo a tcsh, esta costuma a ser a shell pré-defenida para
o root.
●
bash: (Bourne-Again SHell) Muito similar a sh, esta é a shell mais utilizada
por conter características como: Auto-Complete, podemos personalizar
todo o output de uma forma simples,entre outras....
●
tcsh: Compatível e semelhante a csh.
●
ksh: Considerada a mais popular no sistema Unix, tendo todas as funções
do sh. Korn Shell foi a primeira a introduzir recursos avançados.
●
zsh: Z Shell tem como grande vantagem um enorme interpretador de
comandos
E os interpretadores de comandos?
Interpretadores de comandos são programas de computador responsáveis
por tomar as ações efetivas conforme a orientação do usuário através de
comunicação textual. Exemplos de Interpretadores de comandos:
●
csh
●
perl
●
sh
●
expect
●
bash
●
awk
●
tcsh
●
Basic
●
ksh
●
Vbscript
●
zsh
●
PHP
●
python
Qual a diferença entre um compilador e um interpretador?
Compilador: É um programa responsável por gerar, a partir de de um
programa escrito em linguagem de alto nível, um programa em
linguagem de máquina, não executável. As linguagens de alto nível
não possuem nenhuma relação direta com a máquina, ficando esta
preocupação para o compilador. Exemplos: C, C++, Delphi, Visual
Basic, etc ...
Interpretador: Interpretador é
considerado um tradutor que não
gera código objeto. A partir de um programa fonte, escrito em
linguagem de alto nível, o interpretador, no momento da execução do
programa, traduz cada instrução e a executa em seguida. Exemplo de
linguagens interpretadas: bash, sh, basic, VBscript, PHP, etc...
Linguagens “Híbridas”: Interpretada e compilada. Ex. Python, java.
Onde encontro o Shell?
O Sistema Operacional é o código executor das
chamadas de sistemas.
Onde encontro o Shell?
Shell é fundamentalmente uma interface entre o
Sistema Operacional e o seu usuário.
Como funciona um Shell?
Para inicarmos os estudos sobre Shell Script vamos
utilizar o bash (/sbin/bash).
O BASH permite a execução de seqüências de
comandos direto no prompt do sistema ou escritas em
arquivos de texto, conhecidos como shell scripts.
O BASH é o shell desenvolvido para o projecto GNU,
da Free Software Foundation, que se tornou padrão nas
várias distribuições Linux. Pode ser usado também com
outros sistemas operacionais, como o Unix. É compatível
com o Bourne shell (sh), incorporando os melhores
recursos do C shell (csh) e do Korn Shell (ksh).
Como funciona um Shell?
Pode-se pode customizar o ambiente do bash utilizando
alguns arquivos/diretórios como:
●
●
●
●
/etc/profile
/etc/skel
.bash_profile
.bash_rc
Importante: Nos sistemas GNU/Linux nomes de arquivos
são case-sensitive, ou seja, distinguem maiúsculas de
minúsculas e vice-versa.
TESTE != Teste != teste
Como funciona um Shell?
O ambiente de uma sessão SHELL tem seu
comportamento alterado de acordo com o conteúdo de
algumas variáveis de ambiente, por exemplo:
BASH
HOSTNAME
USER
USERNAME
PATH
PS1
PS2
DISPLAY
SHELL
HISTFILE
HISTFILESIZE
Como funciona um Shell?
Designadores de expansão de histórico
!!
History
!n
!-n
!string
-
!?string
-
^string1^string2
-
chama o último comando utilizado
mostra o histórico de comandos
refere-se ao número n do histórico
comando atual -n do histórico
refere-se ao último comando que
começa com a string (expressão)
refere-se ao último comando que
contenha a string (expressão)
repete o último comando substituindo
a ocorrência string1 por string2
Como funciona um Shell?
Um comando para ser interpretado é dividido em
partes distintas:
parana@acer:~$ ps -aux | grep bash
1ª parte) comando, o shell identifica se o arquivo
existe no PATH e se o usuário possui privilégios suficientes
para executá-lo;
2ª parte) identifica por espaços quais são os
parâmetros/argumentos. Esses alteram de alguma forma o
comportamento durante a execução e/ou saída do
comando;
3ª parte) saída (direcionamento/pipe) que permite ao
usuário receber o retorno da execução, seja saída padrão
ou alguma mensagem de erro/advertência;
Como funciona um Shell?
Onde encontrar um terminal num sistema GNU/Linux?
●
●
●
●
Os consoles são levantados pelo init na inicialização do sistema:
/etc/inittab
Controlados pelo getty (/sbin/getty) que abre um novo processo
para
controlar
uma
porta
ttyX
(/dev/ttyX)
Por padrão
/dev/tty1
/dev/tty2
/dev/tty3
/dev/tty4
/dev/tty5
/dev/tty6
são definifos 6 consoles virtuais:
CRTL+ALT+1
CRTL+ALT+2
CRTL+ALT+3
CRTL+ALT+4
CRTL+ALT+5
CRTL+ALT+6
Como em todo sistema GNU/Linux é necessário que se realize a
autenticação antes de iniciar o uso.
Como funciona um Shell?
Onde encontrar um terminal num sistema Gráfico?
●
●
●
O xterm é um emulador de terminais leve e direto;
Comando para instalação no Debian: apt-get install xterm
A variável de ambiente $TERM por padrão define xterm como
terminal a ser utilizado por diversos sistemas.
Como funciona um Shell?
gnome-terminal
●
●
●
O gnome-terminal é o terminal padrão do Gnome (ambiente de
trabalho gerenciado pelo servidor Xorg);
Onde encontro? Menu: Aplicações – Acessórios – Terminal
A variável de ambiente $COLORTERM define o gnome-terminal
como o terminal padrão.
Como funciona um Shell?
konsole
●
●
●
O konsole é o terminal padrão do KDE (ambiente gráfico
gerenciado pelo servidor Xorg);
Onde encontro? KDE-Menu: Sistemas – Konsole
O Konsole permite múltiplas sessões em abas, histórico, impressão
e favoritos.
Comandos Básicos
$ <comando> --help
$ free
$ man <comando>
$ locate
$ ls
$ find
$ cat
$ uptime
$ cd
$ alias
$ mkdir
$ touch
$ rm
$ sort
$ rmdir
$ uniq
$ date
$ ln
$ su
$ uname
$ du
$ wc
$ df
$ tar
$ continua . . .
Comandos Básicos
$ <comando> --help Mostra os principais paramêtros e forma de uso
$ man <comando>
Manual on-line do comando
-t <manpage> | ps2pdf14 - <arquivo>.pdf
$ ls
Lista o conteúdo de um diretório
-l
-la -lh -lha -R
$ cat
Lista o conteúdo de um arquivo de texto
-n -b -T
$ cd
Alterna entre um diretório e outro
Comandos Básicos
$ mkdir
-p
Cria um novo diretório
-v -m=600
$ rm
Deleta arquivos e diretórios
-r
-f
-rf
-i
-v
$ rmdir
Deleta diretórios vazios
$ date
Mostra e altera a data/hora do sistema
+FORMATO %H %M %d %m %Y . . .
$ date mesdiahoraminuto[segundo][ano]
Comandos Básicos
$ su
$ du
Alterna entre um usuário e outro no sistema
-c <comando> -s SHELL
Mostra o uso do disco por um arquivo ou diretório
-s -h -sh
$ df
Mostra o status sobre partições em uso, ou da partição
onde um determinado arquivo está armazenado.
-h -a [arquivo]
Comandos Básicos
$ free
Mostra uso de memória RAM (/proc/meminfo)
-b -k -m -g
$ locate <string>
localiza um arquivo ou diretório (updatedb)
Base: /var/cache/locate/locatedb
$ find
localiza um arquivo ou diretório
-name -iname -a -o
-size -type -perm -cmin -ctime -mtime -regex -gid -group
-printf
-exec <comando> {} \;
Comandos Básicos
$ uptime tempo desde que a maquina iniciou
$ alias
mostra e cria um “atalho” para um comando/parametros
$ touch
altera data criação/alteração de um arquivo
-c -t -a -m
$ sort
exibe de forma a ordenar o conteúdo de um arquivo
-u -n -r
Comandos Básicos
$ uniq
oculta linhas repetidas
$ ln
cria links simbólicos e hard links
-s
$ uname exibe informações sobre o sistema, como a versão do Kernel
-r -a
$ wc
realiza a contagem de linhas, palavras e caracteres
-l -c -m -w
$ tar
empacota arquivos/diretórios em um único arquivo
-cvzf -zvxf -cvjf -zvjf -rf -tf
Comandos Básicos
Exercícios de Fixação
1) De que forma você poderia descobrir em que diretório você está?
2) Qual a diferença entre ( cd / cd .. cd)?
3) Diferencie caminho absoluto e caminho relativo.
4) Qual a seqüência de comando para criar um subdiretório (teste) em
/home?
5) Como criar 5 diretórios hierárquicos de uma única vez (Ex.
/home/teste/aula/gerds/pos/aula1)?
6) Crie um hard link para arquivo /etc/profile em /tmp/profile.
7) Crie um soft link para o arquivo /etc/resolv.conf em /tmp/dns.
8) Qual a diferença encontrada entre soft link e hard link?
Redirecionamento
Operador
Ação
<
Redireciona a entrada padrão (STDIN)
>
Redireciona a saída padrão (STDOUT )
2>
Redireciona a saída de erro (STDERR)
>>
Redireciona a saída padrão, anexando
2>>
Redireciona a saída de erro, anexando
|
Conecta a saída padrão com a entrada padrão de outro comando
2>&1
Conecta a saída de erro na saída padrão
>&2
Conecta a saída padrão na saída de erro
>&-
Fecha a saída padrão
2>&-
Fecha a saída de erro
Comandos Básicos
Exercício de Fixação
1) Crie um diretório “shell”, dentro dele um novo arquivo “file” e
altere a sua data de criação/alteração para 01/01/2010 15:00.
2) Altere a data do sistema para 22/09/1978 ás 10 horas.
3) Crie um alias chamado “kernel” que mostre a versão do Kernel.
4) Informe quantos usuários e grupos estão cadastrados, inclusive
usuários e grupos de sistema.
5) Liste todos os usuários do sistema, e suas propriedades, por ordem
alfabética de login.
6) Ordene a saída do comando abaixo:
$ echo -e "10 \n 4 \n 8 \n 6 \n 0 \n 2"
Comandos Básicos
Exercício de Fixação
7) Mostre o status de uso das partições dos arquivos
/etc/debian_version e /proc/meninfo, explique porque são diferentes se
os dois arquivos pertencem a mesma árvore de diretórios?
8) Atualize a base de dados do comando locate em background,
depois localize o arquivo “70-persistent-net.rules”.
9) Liste todos os sub-diretórios do diretório /home dentro do arquivo
/tmp/HomeDirs.txt
10) Com um único comando liste todos os arquivos do sistema, não
listar diretórios, que iniciem com a letra a (A ou a), tenham a extensão
.txt, e mostre também o tamanho de cada um deles. Não mostre
saídas de erro.
Comandos Básicos
Exercício de Fixação
11) Execute um único comando que crie cópias backup de todos os
arquivos de extensão ".txt" do sistema em um arquivo
/tmp/backuptxt.tar;
12) Crie os alias de comando conforme exemplo abaixo:
$ data
Data do sistema (dd/mm/yyyy): 19/07/2010
$ hora
Hora do sistema: 22:15
13) Altere a data de modificação do arquivo /etc/passwd para:
Sex Jul 9 10:26:16 BRT 2010
Principais arquivos/diretórios de configuração
DEBIAN GNU/LINUX
REDHAT
$ /etc/inittab
$ /etc/hostname
$ /etc/passwd
$ /etc/shadow
$ /etc/group
$ /etc/profile
$ /etc/skel
~$ .profile
~$ .bashrc
~$ .bash_history
~$ .bash_logout
$ /etc/sysconfig/network
Principais arquivos/diretórios de configuração
DEBIAN GNU/LINUX
REDHAT
$ /etc/addusers.conf
$ /etc/login.defs
$ /etc/security/
$ /etc/network/interfaces
$ /etc/resolv.conf
$ /etc/host.conf
$ /etc/hosts
$ /etc/rc*
$ /etc/inetd.conf
$ /etc/crontab
$ /etc/cron.*
$ /etc/sudoers
$ /etc/fstab
$ /etc/sysconfig/network-scripts/ifcfg-ethX
Principais arquivos/diretórios de configuração
$ /etc/issue
$ /etc/motd
$ /etc/services
$ /etc/protocols
$ continuar . . .
Outros diretórios importantes:
/tmp
/var/log
Principais arquivos/diretórios de configuração
Exercício de Fixação
1) Qual o arquivo responsável pela configuração dos servidores de
nomes?
2) Identifique na lista de serviços associados as portas TCP/UDP qual é
a porta do serviço ldap?
3) Liste a configuração das partições e pontos de montagem utilizados
pelo sistema durante a inicialização.
4) Identifique em que datas/horários o sistema executa comandos
programados nas “tarefas agendadas”.
5) Se durante o logon dos usuários do sistgema fosse identificado que
se está executando um script de forma indevida, ou sem necessidade,
quais os arquivos poderiam ser verificados?
Principais arquivos/diretórios de configuração
Exercício de Fixação
6) Ao alterar o nome da estação, quais arquivos devem ser verificados
antes da próxima reinicialização?
7) Se o usuário jose precisar reiniciar as interfaces de rede ou outros
serviços, mas não tem acesso de root, como poderia liberar o acesso
somente para esse usuário realizar essa tarefa?
8) Ao instalar o serviço telnetd desejamos que esse serviço não seja
carregado durante a inicialização, qual o procedimento necessário?
9) Descreva a configuração estática, para Debian, do endereço de rede
do host educacao.edu.br 200.120.114.20/24, gateway
200.120.114.254, dns 8.8.8.8:
Comandos de rede
$ arp
$ wget
$ dig
$ getent
$ nslookup
$ iftop
$ ifconfig
$ ssh
$ ifup
$ scp
$ ifdown
$ finger
$ mii-tool
$ links / links2 / lynx
$ netstat
$ fping
$ ntpdate
$ nmap
$ route
$ tcpdmatch
$ traceroute
Comandos de rede
$ arp permite uso da tabela dinânica de endereços da camada 2
-a [unix [kmem ] ]
-d hostname
-f filename
(padrão: /etc/ethers)
-s hostname ether address [ temp ] [ pub ] [ trail ]
$ dig permite auditorias em um servidor DNS para testar suas
configurações
-x
<dominio> NS
<dominio> MX
Comandos de rede
$ ifconfig <interface> utilitário de configuração das interfaces de rede
up | down | <address > netmask <mask>
hw ether <mac> | <alias>
$ ifup <interface> ativa as interfaces de rede
(/etc/network/interfaces)
-a
$ ifdown <interface> desativa as interfaces de rede
-a
(/etc/network/interfaces)
Comandos de rede
$ mii-tool -i <interface> lista o status de conexão nas interfaces
-r -w -F (100baseTx-FD | 100baseTx-HD | 10baseT-FD | 10baseT-HD)
$ netstat lista o status das conexões, tabelas de roteamento, e
estatisticas das interfaces. (Vários arquivos do /proc são lidos)
-a -r -M -s
# netstat -a | less
Conexões Internet Ativas (servidores e estabelecidas)
Proto Recv-Q Send-Q Endereço Local
tcp
0
0 0.0.0.0:6566
tcp
0
0 127.0.0.1:3306
tcp
0
0 0.0.0.0:22
Endereço Remoto
0.0.0.0:*
Estado
OUÇA
0.0.0.0:*
OUÇA
0.0.0.0:*
OUÇA
# netstat -r
Tabela de Roteamento IP do Kernel
Destino
10.15.16.0
default
Roteador
*
10.15.16.1
MáscaraGen.
Opções MSS Janela irtt Iface
255.255.252.0 U
0.0.0.0
UG
00
00
0 eth0
0 eth0
Comandos de rede
$ ntpdate
ajusta a data e hora via NTP (Network Time Protocol)
-q -k -t
# ntpdate pool.ntp.org
$ route
exibe e atualiza a tabela de rotas
Add | del | -net | -host | default gw
$ tcpdmatch testa as regras para conexões usando tcpwrapper
# tcpdmatch telnet [email protected]
client: address 10.15.17.255
client: username aluno
server: process telnet
matched: /etc/hosts.deny line 21
access: denied
$ traceroute exibe a rota realizada por um pacote ICMP
-i -m -s -w
# traceroute 8.8.8.8
Comandos de rede
$ wget baixa arquivos por HTTP, HTTPS, and FTP protocols
-r -o
$ iftop mostra informações sobre o uso da rede, por interface
-i -n -F
$ ssh acesso remoto Secure Shell
(/etc/ssh/ssh_config /etc/ssh/sshd_config)
-i -o -p
$ scp transfere arquivos via SSH
-i -o -P
(/etc/ssh/ssh_config /etc/ssh/sshd_config)
Comandos de rede
Exercícios de Fixação
1) Qual o endereço de hardware (MAC) da interface de rede da sua estação de trabalho?
2) Verifique se a sua interface de rede estabeleceu um link de rede, qual sua velocidade
+ modo de operação. Altere esse modo para Half Duplex com transferẽncia de 100
mbps sem utilizar autonegociação.
3) Configure sua estação de trabalho para utilizar as seguintes regras de rede: Interface
eth0:0 192.168.2.0/24 GW 192.168.2.1
4) Baixe o arquivo http://gerds.utp.br/roberto/linux/linux.doc por linha de comando e
transfira uma cópia, por ssh, para a estação 192.168.2.101, utilizando o usuário aluno.
5) Após o exercício 4 identifique o endereço MAC da estação 192.168.2.101 através da
sua tabela dinâmica de endereços de hardware.
6) Se eu tiver um servidor apache (porta 80) e quiser saber quantas conexões estão
abertas, qual comando poderia auxiliar nessa questão?
Comandos de rede
Exercícios de Fixação
7) Como verificar se o tcpwappers contém alguma regra que limita o acesso telnet do
cliente 10.10.10.10 a sua estação de trabalho?
8) Como verificar se a estação 10.10.10.10 possui a porta de ftp aguardando conexões
de rede, se está fechada ou se possui algum filtro?
9) Qual o comando que realiza uma consulta de data/hora de um servidor NTP
200.160.0.8, sem alterar a data/hora do sistema?
10) Identifique na rede 10.10.10.0/24 quantos equipamentos ativos estão respondendo
ICMP:
11) Tente mapear a rota, utilizando protocolo ICMP, para se chegar a um dos servidores
da página www.google.com.br
12) Ao baixar um arquivo de uma página qualquer identifique qual a maior taxa de
transferência atingida.
Comandos avançados
$ dd
$ nohup
$ killall
$ diff
$ pidof
$ top
$ which
$ pstree
$ continuar ..
$ fsck
$ stat
$ last
$ sync
$ lastlog
$ watch
$ lsof
$ dmesg
$ lspci
$ hwclock
$ lsusb
$ bg
$ mount
$ fg
$ nice
$ jobs
$ renice
$ kill
Comandos avançados
$ dd
converte e copia arquivos e dispositivos de blocos
if=<> of=<> bs=x count=x
$ diff
permite comparar arquivos linha a linha
<file1> <file2>
Seu uso comum é a criação de patch e para controle de alterações.
$ which informa o caminho absoluto do arquivo de um comando
<comando>
Obs.: é necessário que o comando esteja no PATH do usuário.
Comandos avançados
$ fsck
verifica e repara sistemas de arquivos GNU/Linux.
Pacotes: e2fsprogs dosfstools ntfsprogs xfsprogs reiserfsprogs
reiser4progs jfsutils
$ last
lista os últimos logins realizados (/var/log/wtmp)
<usuário> | -n |
$ lastlog
lista o último login de todos os usuários do sistema
-t <dias> -u <usuário>
Comandos avançados
$ lsof
lista os recursos utilizados por um determinado processo
-p <pid> | -u <usuario> | …
$ lspci
lista os dispositivos do barramento PCI
-v | -vv
$ lsusb
lista os dispositivos do barramento USB
-v | -d <device>
Comandos avançados
$ mount
lista dispositivos em uso e monta filesystem
-a | <dispositivo> | -t <filesystem> | -o <opções>
$ nice
altera a prioridade padrão (0) ao iniciar um processo
-n <prioridade -19 a 20>
$ renice
altera a prioridade de um processo em execução
<prioridade -19 a 20 > <pid>
Comandos avançados
$ nohup
altera a saída padrão de um comando <non-tty>, tornando
seu processo independente do terminal (Shell)
nohup <comando>
nohup: a ignorar a entrada e a acrescentar a saída a `nohup.out'
$ pidof
procura o número do processo em execução
<programa>
$ pstree
lista a árvore de processos em execução, permitindo
visualizar a relação de dependências entre os processos
-p
Comandos avançados
$ stat extrai informações de arquivos e sistemas de arquivos
<file> | -f | -t
$ sync assegura que os discos estejam sincronizados com o cache
$ watch
executa um programa periodicamente, atualizando a saída
na tela.
-n <comando>
Comandos avançados
$ dmesg
exibe a saída da inicialização gerada pelo kernel lendo um
buffer utilizado pelo kernel para enviar mensagens de eventos
$ hwclock
exibe e altera a data/hora da máquina
# hwclock --set --date="09/22/1978 10:30"
-w ou --systohc : para copiar a hora do sistema para o relógio da máquina.
-s ou --hctosys : para copiar a hora da máquina para a hora do sistema.
-r ou –show
$ bg
lista e envia processos em segundo plano.
<pid>
Comandos avançados
$ fg
lista e envia processos em primeiro plano (ou plano de frente).
<pid>
$ jobs
lista os processos em segundo plano ou parados (STOP)
jobs
$ kill
envia sinais para os processos
- <sinal> <pid>
-l (lista todos os sinais possíveis de serem enviados)
Comandos avançados
$ killall
envia sinais para os processos com um determinado nome
<nome>
-u <user> | -g <group>
$ top
lista os processos por ordem de consumo de recursos
-u <user> -p <pid's>
Comandos avançados
Exercícios de fixação
1) Identifique os seguintes componentes da sua estação de trabalho:
Processador, placa de vídeo, placa de rede e placa de som.
2) Inicie o Broffice Writer, por linha de comando, com prioridade 15. Depois altere essa
prioridade para -5. Demonstre esse processo com alguma ferramenta que permita
verificar essa alteração.
3) Inicie um processo com o comando sleep (200 segundos) , faça a seguinte sequência
de comandos:
a) pare a execução do comando após ter iniciado:
b) liste os processos parados:
c) reinicie o comando em segundo plano:
d) finalize o processo enviando um sinal SIGKILL para ele:
4) Identifique se na inicialização foi encontrada uma interface de rede (eth0,1), caso
positivo verifique se o link de rede está “up”.
Comandos avançados
Exercícios de fixação
5) Liste todos os recursos de memória (arquivos/bibliotecas carregadas) utilizados
durante a execução do evince (se for necessário instale);
6) Liste informações detalhadas sobre os seguintes arquivos e seus sistemas de
arquivos: /etc/passwd, /dev/cdrom, /proc/cpuinfo
7) Crie um arquivo com 200 MB, formate com o sistema de arquivos xfs. Faça a
montagem no ponto /mnt e com opção de escrita, copie alguns arquivos nele,
desmonte. Realize uma checagem para verificar sua integridade.
8) Como criar um backup com o comando tar de todos os arquivos do diretório /home,
encerrar o terminal e garantir que o comando continue sendo executado?
9) Como descobrir qual o caminho absoluto para o comando locate?
10) Indique uma forma de sabermos se um pendrive foi reconhecido no barramento
USB.
Tipos de variáveis e atribuição
Não é necessário declarar uma variável em Shell Script, na
atribuição não deve-se utilizar espaços e uma variável pode receber
vários tipos de dados.
$ valor=1
$ string=”expressão $USER” # reconhece o caracter especial $
$ string='expressão $USER'
# não reconhece caracteres especiais
$ string=$”expressão”
# reconhece \t \n \a, etc...
$ kernel=`uname -r`
$ kernel=$(uname -r)
$ soma=$((5+8))
Tipos de variáveis e atribuição
Exemplos:
$ nome=Chico
$ idade=6
$ echo O $nome tem $idade anos.
O Chico tem 6 anos.
$ joana=30
$ beth=50
$ echo A soma das idades de Beth e Joana é de $(($joana+$beth)) anos.
A soma das idades de Beth e Joana é de 80 anos.
Tipos de variáveis e atribuição
Exemplos:
#Efetua um cálculo matemático simples.
echo -e “2 x 3 = $((2*3))”
echo -e “(5 + 3)/2 = $(((5+3)/2))”
echo -e “4 - 2 = $((4-2))”
Tipos de variáveis e atribuição
Exemplos:
# Lista de Usuários
USERLIST=`cat /etc/passwd | awk -F: '{print $1}'`
echo $USERLIST
1) Levando em consideração o exemplo abaixo, complete as demais
variáveis:
IP=$(/sbin/ifconfig eth0 | grep "inet end" | awk -F" " '{print $3}')
MASK=
MAC=
GW=
Tipos de variáveis e atribuição
Atribuindo valor a uma variável com o comando read:
$ read -p “Informe seu nome:” NOME
Maria
$ echo $NOME
Maria
Recebendo a informação de uma forma elegante: Dialog
nome=$( /usr/bin/dialog --stdout --inputbox 'Digite seu nome:' 0 0 )
echo "O seu nome é: $nome"
Tipos de variáveis e atribuição
Recebendo a informação de uma forma elegante: Dialog
export DIALOG=$(which dialog)
# Entrada de dados
NOME=$( $DIALOG --stdout --inputbox 'Digite seu nome:' 0 0 )
echo "O seu nome é: $NOME"
# Confirmação
$DIALOG --yesno 'Deseja continuar?' 0 0
echo "$?"
# Mensagem de aviso
$DIALOG --title "Aviso" --msgbox “Não faça isso!” 0 0
# Menu
OPC=$(dialog --stdout --menu "Selecione uma opção: " 0 0 5 1 "Pera" 2 "Uva" 3
"Maçã" 4 "Abacaxi" 5 "Abacate")
echo $OPC
Tipos de variáveis e atribuição
Recebendo a informação de uma forma elegante: Zenity
export ZENITY=$(which zenity)
# Entrada de dados
NOME=$($ZENITY --entry --title "NOME" --text "Digite seu nome: ")
echo "O seu nome é: $NOME"
# Confirmação
$ZENITY --question --title "YES / NO" --text "Tem certeza?"
echo "$?"
# Mensagem de aviso
$ZENITY --info --title "CUIDADO" --text "FUJA. ESSA MULHER TEM DONO."
$ZENITY --notification --title "FUJA" --text "Cuidado. Essa mulher tem dono."
# Menu
OPC="$(zenity --list --column "Selecione uma opção: " --title="FRUTAS" "Abacaxi"
"Banana" "Morango" "Uva" "Sair")"
echo $OPC
Tipos de variáveis e atribuição
Expansão de Strings
${#var} - Retorna o tamanho da string
eval $var - Executa o conteúdo de $var
${!texto*} - Retorna os nomes de variáveis começadas por 'texto'
${var:N:tam} - Retorna 'tam' caracteres à partir da posição 'N'
${var#texto} - Corta 'texto' do início da string
${var%texto} - Corta 'texto' do final da string.
Tipos de variáveis e atribuição
SubString
$ SUBSTR=”meusapato”
$ echo ${SUBSTR:$[3]}
sapato
$ echo ${SUBSTR:$[-6]}
sapato
$ echo ${SUBSTR:$[0]:$[3]}
meu
Tipos de variáveis e atribuição
$ SUBSTR=”Meu sapato velho. Meu sapato novo.”
Substituição de Strings
$ echo ${SUBSTR/sapato/carro}
#Substitui uma vez
Meu carro velho. Meu sapato novo.
$ echo ${SUBSTR//sapato/carro}
#Substitui todas as ocorrências
Meu carro velho. Meu carro novo.
O bom e velho sed
$ echo $SUBSTR | sed "s/sapato/carro/"
$ echo $SUBSTR | sed "s/sapato/carro/g"
#Substitui uma vez
#Substitui todas
Tipos de variáveis e atribuição
Array em Bash
Quando devo usar?
Devemos usar arrays nas seguintes situações:
1. Quando lidamos com muitos dados do mesmo tipo.
2. Quando esses dados são correlacionados.
3. Quando precisamos trabalhar com esses dados em loops.
4. Quando precisamos de índices para trabalhar nos dados.
5. Quando queremos evitar a fadiga.
6. Encontrar coisas rapidamente.
Exemplo de uso: em lista de cidades, lista de alunos, lista de itens...
Tipos de variáveis e atribuição
Array em Bash
1) Iniciando um array:
$ array=(valor1 valor2 valor3)
2) Vamos a segunda maneira de se criar um array:
$ array2[0]='valor1'
$ array2[1]='valor2'
$ array2[2]='valor3'
Obs.: Acima temos um array com três valores, internamente o shell
armazena essa estrutura dessa maneira:
$ array=([0]="valor1" [1]="valor2" [2]="valor3")
Tipos de variáveis e atribuição
Array em Bash
3) Listar todos os elementos de um array:
$ echo ${array[*]}
4) Contar os elementos de um array:
$ echo ${#array[*]}
5) Contar tamanho de um elemento do array:
$ echo ${#array[<valor>]}
6) Eliminar um elemento do array:
$ unset array[valor]
7) Eliminar um array:
$ unset array
Tipos de variáveis e atribuição
Array - Exemplo de uso
$ LISTA=("Curitiba" "São Paulo" "Rio de Janeiro" "Florianópolis" "Porto Alegre")
$ echo ${LISTA[3]}
Florianópolis
$ echo ${LISTA[1]}
São Paulo
Observe que a lista inicia-se pela posição zero:
0 Curitiba
1 São Paulo
2 Rio de Janeiro
...
Variáveis de Ambiente
LANG = Codificação do terminal e linguagem padrão
HOME = Diretório home do usuário logado
USER / USERNAME = Nome do usuário logado
PWD = Diretório corrente
PATH = Caminhos pelos quais o shell procurará os comandos que você
tentar executar
HOSTNAME = Nome da estação de trabalho
http_proxy = Proxy da rede para conexões externas
? = Valor de retorno do ultimo comando executado
Variáveis de Ambiente
PS1 = Formata o prompt padrão
RANDOM = Fornece um número inteiro de forma aleatória
DISPLAY = Id do display utilizado pelo servidor X na corrente sessão
HISTFILE = Arquivo que irá armazenar o histórico dos comandos
HISTFILESIZE = Tamanho máximo do arquivo com histórico
…
Dica para ver todas as váriaveis:
$ echo $<tab>
Trabalhando com arquivos de texto
Shell é o ambiente.
Um Shell Script é formado por um conjunto de comandos que serão
executados a partir de um arquivo de texto.
Para facilitar o entendimento sobre Shell Script teremos que
analisar vários fatores que irão contribuir para sua correta execução:
1) FHS – Arquivos e diretórios
2) Sistema de permissões
3) Filtros de texto
4) Editores de texto
5) Comandos básicos do Shell
Trabalhando com arquivos de texto
FHS – Arquivos e diretórios
http://www.pathname.com/fhs/
Trabalhando com arquivos de texto
FHS – Arquivos e diretórios
http://www.pathname.com/fhs/
/ – É na raiz que ficam todos os diretórios do GNU/Linux;
/bin – Contém os comandos essenciais para o funcionamento do sistema;
/boot – Arquivos necessários à inicialização do sistemae os arquivos do gerenciador de boot;
/dev – Armazena todos os arquivos-dispositivos, chamados de nós de dispositivos;
/etc – Arquivos de configuração do sistema da máquina local;
/lib – Biblilotecas compartilhadas e módulos do kernel;
/media – Ponto de montagem para mídias removíveis;
/mnt – Diretório usado como ponto de montagem de sistema de arquivos;
/opt – Normalmente, é utilizado por programas que foram instalados com o sistema já em
funcionamento, e precisam de um espaço maior para serem armazenados (ex. OpenOffice);
/var – Contém arquivos de dados variáveis;
/sbin – Comandos utilizados para inicializar, reparar, restaurar e/ou recuperar o sistema;
/tmp – Utilizado para armazenar arquivos temporários;
Trabalhando com arquivos de texto
FHS – Arquivos e diretórios
http://www.pathname.com/fhs/
/usr - Armazena dados compartilhados, somente-leitura;
/home – É o diretório que mantém os dados dos usuários;
/root – Diretório pessoal do adminsitrador (root) do sistema;
/proc – Diretório virtual, mantido pelo kernel onde encontramos a configuração atual do sistema;
Trabalhando com arquivos de texto
Sistema de permissões
Tipos de permissões
Trabalhando com arquivos de texto
Sistema de permissões
Tipos de permissões
aluno@gerds123:~/curso$ ls ­l
total 29604
­rw­r­­r­­ 1 aluno cstr 2007101 Jan 5 10:58 Curso­Gnome.pdf
drwxrwxrwx 5 aluno cstr 44 Jan 12 14:46 Debian­Desktop
­rwxr­xr­x 1 aluno cstr 5591278 Jan 12 15:24 Desktop.sh
­rw­­­­­­­ 1 aluno cstr 1314131 Jan 4 09:12 Expresso.pdf
drwxrwxrwx 3 aluno cstr 19 Jan 12 14:46 Pessoa
­rw­r­­r­­ 1 aluno cstr 6811510 Jan 13 10:50 SL­2.odp
­rw­r­­r­­ 1 aluno cstr 6264237 Jan 12 16:01 SL.odp
drwxrwxrwx 3 aluno cstr 17 Jan 12 14:46 Totais
Trabalhando com arquivos de texto
Sistema de permissões
SUID
Permissões especiais
Se este bit estiver ligado em um arquivo executável, isso indica que que ele vai rodar
com as permissões do seu dono (o proprietário do arquivo) e não com as permissões do
usuário que o executou.
OBS: Só tem efeito em arquivos executáveis.
SGUID
Faz o mesmo que o SUID, mas agora o arquivo executado vai rodar com as permissões
do grupo do arquivo. Se aplicado a um diretório, força os arquivos/diretórios criados
dentro dele a ter o mesmo grupo do diretório pai, ao invés do grupo primário do usuário
que o criou.
STICKY
Se este bit for ativado, faz com que arquivos criados em um determinado diretório só
possam ser apagados por quem o criou (dono) ou pelo super-usuário do sistema. Um
exemplo de uso do STICKY é o diretório /tmp.
Trabalhando com arquivos de texto
Sistema de permissões
Utilitários
# chmod
Sintaxe: chmod <permissões> <arquivo/diretório>
Muda as permissões de um arquivo ou diretório. Existem várias formas de se alterar
as permissões, escolha a que mais lhe agrada.
# chown
Sintaxe: chown <usuário> <arquivo/diretório> OU
Sintaxe: chown <usuário>.grupo <arquivo/diretório>
O comando chown permite que se altere o usuário proprietário de um arquivo ou
diretório. Possui a possibilidade de alterar o grupo junto ao proprietário.
# chgrp
Sintaxe: chgrp <grupo> <arquivo/diretório>
Muda o grupo do qual um arquivo ou diretório faz parte.
Trabalhando com arquivos de texto
Sistema de permissões
Utilitários
# umask
Sintaxe: umask <valor>
Define uma máscara de permissão pela qual os novos arquivos e diretórios serão
criados.
Trabalhando com arquivos de texto
Exercicios de Fixação
1) Foi determinado que os usuários comuns (não root) não deverão executar o
comando df. Como retirar a permissão do comando df para que esses usuários
não possam executá-lo?
2) Altere o grupo do arquivo /var/log/lpr.log para lpadmin para que os usuários
desse grupo possam ler este arquivo.
3) Como fazer para que um diretório compartilhado pelo samba crie arquivos
fazendo com que ele mantenha as permissões para o grupo de usuários, ou
seja, a pessoa (com autorização) que executar o arquivo (acessar o diretório),
o fará com se fosse membro do grupo a qual pertence o arquivo.
4) Como definir que um determinado arquivo tenhas as seguintes permissões:
Dono: Ler, Gravar e Executar Grupo: Ler e Gravar Outros: Ler
5) Qual o diretório que mantêm informações do sistema que podem variar
durante o uso dos recursos (daeom, logs, etc...)?
6) Qual diretório que mantém pontos dinâmicos de montagem de mídias
removiveis?
Trabalhando com arquivos de texto
Filtros de Texto
O Linux possui diversas ferramentas para
trabalhar e transformar arquivos texto, puros sem
formatação especial.
Estas ferramentas são úteis quando estamos
trabalhando
com
Scripts,
Arquivos
de
Configuração, Arquivos de Log, etc.
Trabalhando com arquivos de texto
Filtros de Texto
cat - concatenar arquivos, ou entrada padrão, para a saída
padrão.
# cat teste1.txt
# cat teste1.txt teste2.txt > teste
# cat teste3.txt >> teste
# cat < texto.txt
# cat texto.txt | wc -l
Trabalhando com arquivos de texto
Filtros de Texto
cut - Lê o conteúdo de um ou mais arquivos e tem como saída uma coluna
vertical
Opções
-b numero - Imprime o byte número
-c número - Imprime o caractere número
-d delimitador - Delimitador que separa as colunas
-f número - Imprime a coluna número
Trabalhando com arquivos de texto
Filtros de Texto
Exemplos de uso do comando cut:
# ifconfig eth0 | grep 'inet ' | cut -d ':' -f 2 | cut -d ' ' -f 2
# ls -la | cut -c 47-70
# $cut –d : -f 1 /etc/passwd
# cat /etc/hosts | cut –f 2
Trabalhando com arquivos de texto
Filtros de Texto
expand - Troca a tabulação dentro dos textos pelo número de espaços. Deixa o
texto mais fácil sua leitura.
Opções:
-t número - especifica o número de espaço para o tab.
-i - Converte somente no início das linhas
Exemplo de uso:
$ cat LEIAME.TXT
aaaa
a a a a
$ expand -t 1 LEIAME.TXT
aaaa
aaaa
Trabalhando com arquivos de texto
Filtros de Texto
fmt - Formata um texto com uma largura específica. Pode remover ou adicionar
espaços.
Opções:
-w número - Configura a largura desejada para o texto
$ fmt –w 50 texto.txt
Trabalhando com arquivos de texto
Filtros de Texto
grep - Procura por linhas/palavras em um arquivo que satisfaça um determinado
padrão de busca.
Opções:
-i
ignora maiúscula e minúscula
-c
contar quantas coincidências
-l
não mostra a linha encontrada
-v
Mostra as linhas não coincidentes
-n
Mostra a linha dentro do arquivo
Trabalhando com arquivos de texto
Filtros de Texto
Exemplos de uso do grep
$ grep aluno /etc/passwd (Forma não elegante: # cat /etc/passwd | grep aluno)
$ grep aluno /etc/passwd |cut –d : -f 5
$ grep eth0 /proc/net/dev
$ ifconfig eth0 | grep packets
Trabalhando com arquivos de texto
Filtros de Texto
head - Mostra as primeiras 10 linhas do início de um texto, ou um número de
linhas definido pelo usuário.
Opções:
-n número
Configura o número de linhas a ser mostrada
$ head –n 20 /etc/passwd
Trabalhando com arquivos de texto
Filtros de Texto
tail - Mostra as últimas 10 linhas do fim de um texto, ou um número de linhas
definido pelo usuário.
Opções:
-n número
Configura o número de linhas a ser mostrada
$ tail –n 20 /etc/passwd
Trabalhando com arquivos de texto
Filtros de Texto
join - Unes a linhas de ambos os arquivos que tenham um índice comum.
Usado para criar um banco de dados simples.
Opções:
-j1 número - Escolhe o campo número como índice para o arquivo1
-j2 número - Escolhe o campo número como índice para o arquivo2
-j número -j1 número - Escolhe o campo número como índice para ambos
arquivos
Trabalhando com arquivos de texto
Filtros de Texto
Exemplo de uso do comando join
Supondo um arquivo com:
1. GZH-1234
2. HYD-2389
Outro arquivo com:
1. Fiat Uno Mille
2. Audi A3
$ join –j 1 arquivo1 arquivo2
1. GZH-1234 Fiat Uno Mille
2. HYD-2389 Audi A3
Trabalhando com arquivos de texto
O poderoso SED
O utilitário “sed” é um editor de streams. Um programa desta natureza, é
usado para realizar transformações num arquivo de texto ou num pipe (fluxo de
dados). Sed é bastante útil para fazer trocas de letras, palavras ou linhas
inteiras de texto. É uma ferramenta largamente utilizada em scripts shell.
sed [opções] [script] [arquivo/pipe]
Trabalhando com arquivos de texto
O poderoso SED – exemplos de uso:
$ sed “n” teste.txt
Imprime o conteúdo do arquivo “teste.txt” na saída padrão (monitor).
$ sed -n “2,4p” teste.txt
Imprime da segunda à quarta linha do arquivo “teste.txt” na saída padrão
(monitor).
$ sed “s/zé/marcius/” teste.txt
Substituí a primeira ocorrência da string “zé” de cada linha por “marcius”,
presente no arquivo “teste.txt”.
Trabalhando com arquivos de texto
O poderoso SED – exemplos de uso:
$ sed -e “2q” -e “s/zé/marcius/” teste.txt
Processa o arquivo “teste.txt” até o inicio da segunda linha, substituindo a
primeira ocorrência da string “zé” por “marcius”.
$sed “s/zé/marcius/2” teste.txt
Substituí a segunda ocorrência da string “zé” de cada linha, pela string
“marcius”, presente no arquivo “teste.txt”.
$sed “/^$/d” teste.txt
Apaga as linhas em branco do arquivo “teste.txt”.
Trabalhando com arquivos de texto
O poderoso SED – exemplos de uso:
$ sed “/zé/d” teste.txt
Apaga as linhas que contenham a string “zé” do arquivo “teste.txt”.
$sed -i “s/samba/rede/” teste.txt
Substituí a primeira ocorrência da string “samba” de cada linha por “rede”, e
grava esta alteração no arquivo “teste.txt”.
$ sed “/CPPC/Id” teste.txt > teste_modificado.txt
Apaga todas as linhas que contenham a string “CPPC”, independentemente
de maiúsculas e minúsculas, gravando o resultado no arquivo
“teste_modificado.txt”.
Trabalhando com arquivos de texto
Exercícios de Fixação
1) Liste as linhas do arquivo /etc/group em que o usuário aluno esteja presente.
2) Liste todos os usuários do sistema, apresentando na saída do comando
apenas o nome do usuário e seu respectivo UID.
3) Liste apenas as linhas do /etc/passwd com usuários que iniciem com “a”.
4) Liste apenas as 5 últimas linhas do arquivo /etc/passwd que terminem com a
expressão “/bin/sh”.
5) Altere a saída do comando lspci para apresentar a seguinte saída para
placas de vídeo, som e rede:
# lspci | <xxx | xxx | xxx>
00:14.2 Placa de som: ATI Technologies Inc SBx00 Azalia (Intel HDA)
01:05.0 Placa de Vídeo: ATI Technologies Inc RS690 [Radeon X1200 Series]
02:00.0 Placa de rede: Realtek Semiconductor Co., Ltd. RTL8101E/RTL8102E
Trabalhando com arquivos de texto
Editores de texto
cat
nano
gedit
oowriter
Continuar...
Editor escolhido: Vim - Visual Interface Improved
Para obter mais informações sobre VIM consulte:
http://aurelio.net/vim/vim-basico.txt
Trabalhando com arquivos de texto
Editores de texto - VIM
Trabalhando com arquivos de texto
Editores de texto – Executando o VIM
$ vim => Abre o vim vazio, sem nenhum arquivo e exibe a tela de apresentação.
$ vim arquivo => Abre o arquivo de nome "arquivo".
$ vim arquivo + => Abre o arquivo de nome "arquivo", com o cursor no final do mesmo.
$ vim arquivo +10 => Abre o arquivo de nome "arquivo", com o cursor na linha 10.
$ vim arquivo +/Copag => Abre o arquivo de nome "arquivo", na primeira ocorrência da palavra "Copag".
Trabalhando com arquivos de texto
Editores de texto - VIM
No vim temos vários "modos", que são estados do editor.
São eles:
Modo Tecla Rodapé Descrição ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ de Inserção i ­­ INSERT ­­ Inserção de texto
de Comandos <ESC> Comandos de manipulação de texto
Linha de comando : : Comandos de manipulação arquivo Visual v ­­ VISUAL ­­ Seleção visual de texto
Busca / / Busca de padrões no texto
Reposição R ­­ REPLACE ­­ Inserção sobreescrevendo
Trabalhando com arquivos de texto
Editores de texto – VIM – Modo de comando
:w => Salva o arquivo que está sendo editado no momento.
:q => Sai.
:wq => Salva e sai.
:x => Idem.
ZZ => Idem.
:w! => Salva forçado.
:q! => Sai forçado.
:wq! => Salva e sai forçado.
Trabalhando com arquivos de texto
Editores de texto – VIM – Modo Visual
Entre no modo visual: v
Agora, utilize as teclas direcionais (setas) do teclado, para selecionar o texto desejado.
Pressione e cole, utilizando a tecla "p" (paste).
Veja agora como apagar um determinado texto:
Utilizando normalmente as teclas Backspace/Delete, ou entrando em modo visual (v) e pressionando a tecla Delete.
Você pode remover até o final de uma palavra, utilizando: dw
Pode também remover até o final de uma frase: d$
Trabalhando com arquivos de texto
Criando o primeiro arquivo de Shell Script
$ vim helloword.sh
#!/bin/bash
VAR=“Hello Word!”
echo $VAR
$ chmod +x helloword.sh
$ ./helloword.sh
Hello Word!
$bash +xv helloword.sh # Execução em modo de debug.
Trabalhando com arquivos de texto
Exercícios de Fixação
Crie um shell script com a seguinte saída:
­­­­­­­ Descrição do sistema ­­­­­­­­­­­­­
Sistema operacional: $OS
Processador: $CPU
Clock da CPU: $CLOCK
Memória da Máquina: $MEM
Placa de vídeo: $VGA
Placa de Rede: $NET
Placa de Som: $SOUND
Esta máquina já está no ar: $UPTIME
Trabalhando com arquivos de texto
Exercícios de Fixação
Faça um script que liste todos os executáveis que estão no seu PATH, ordene a saída, e grave em um arquivo chamado executaveis.txt. Não deixe aparecer nenhuma mensagem de erro.
Variáveis especiais
Variável
Parâmetros Posicionais
$0
Parâmetro número 0 (nome do comando ou função)
$1
Parâmetro número 1 (da linha de comando ou função)
...
$9
${10}
...
Parâmetro número N ...
Parâmetro número 9 (da linha de comando ou função)
Parâmetro número 10 (da linha de comando ou função)
Parâmetro número NN …
$#
Número total de parâmetros da linha de comando ou função
$*
Todos os parâmetros, como uma string única
$@
Todos os parâmetros, como várias strings protegidas
$$
Número PID do proc esso atual (do próprio script)
$?
Código de retorno do último comando executado
Operadores do Shell
Operadores Aritméticos
Operadores Relacionais
+ Adição
== Igual
-
Subtração
!=
Diferente
*
Multiplicação
>
Maior
/
Divisão
>= Maior ou Igual
% Módulo
<
Menor
** Exponenciação
<= Menor ou Igual
Operadores do Shell
Operadores de Atribuição
=
Atribui valor a uma variável
+=
Incrementa a variável por uma constante
-=
Decrementa a variável por uma constante
*=
Multiplica a variável por uma constante
/=
Divide a variável por uma constante
%=
Resto da divisão por uma constante
++
Incrementa em 1 o valor da variável
–
Decrementa em 1 o valor da variável
Operadores do Shell
Operadores Lógicos
Operadores de BIT
&& E lógico (AND)
||
== Igual
OU lógico (OR)
!=
Diferente
*
Multiplicação
>
Maior
/
Divisão
>= Maior ou Igual
% Módulo
<
Menor
** Exponenciação
<= Menor ou Igual
Estrutura de decisão
if TESTE
then
comandos
elif TESTE
comandos
else
comandos
fi
Caso o comando seja executado com sucesso serão executados os
comandos do bloco then.
Estrutura de decisão
if [ $opc -eq 1 ]
then
inclusao
elif [ $opc -eq 2 ]
then
alteracao
elif [ $opc -eq 3 ]
then
exclusao
elif [ $opc -eq 4 ]
then
exit
else
echo “Digite uma opção entre 1 e 4.”
fi
Estrutura de decisão
Podemos associar a estrutura de decisão com as opções do comando test:
OPERAÇÃO COM ARQUIVOS:
-e arq
verifica se o arquivo existe
-s arq
verifica se o arquivo existe e tem tamanho maior que zero
-f arq
verifica se ele é um arquivo
-d dir
verificar se ele é um diretório
-z arq
verifica se o arquivo existe e tem tamanho zero
-r arq
quero saber se o usuário que esta executando o shell script pode ler o
arquivo
-w arq
quero saber se pode alterar o arquivo
-x arq
quero saber se ele consegue executar o arquivo
... ver $ man teste
Estrutura de decisão
Podemos associar a estrutura de decisão com as opções do comando test:
OPERAÇÃO COM STRING
-n string se é maior que zero
-z string se igual a zero
OPERAÇÃO COM INTEIROS
n1 -eq n2 – igual
n1 -gt n2 – maior
n1 -lt n2 – menor
... Ver $man test
Estrutura de decisão
Exercícios utilizando a estrutura de decisão (if):
1) Crie um shell script que receba dois números inteiros (entre 0 e 100) e
informe se o primeiro é maior, menor ou igual ao segundo;
2) Escreva um script que receba um arquivo por parâmetro, com caminho
absoluto, e informe se o arquivo existe, se tem tamanho maior que zero e se
for um diretório liste seu conteúdo;
3) Crie um programa que recebe um comando simples, por parâmetro,
verifique se ele realmente existe no sistema (informando sua ausência) e
informe o caminho absoluto do seu binário. No final pergunte ao usuário se
ele deseja ver o manual on-line do comando recebido. (considere um comando
válido os comandos encontrados pelo utilitário which)
Estrutura de decisão
É uma estrutura de decisão, ainda mais sofisticada que “if”. A seguir, a
sintaxe de utilização:
case VARIÁVEL in
VALOR1)
comandos;;
VALOR2)
comandos;;
VALOR3)
comandos;;
*)
comandos;;
esac
Estrutura de decisão
HORA=`date +%H`
case $HORA in
0?|1[01]) echo "Bom dia!" ;;
1[2-8]) echo "Boa tarde!" ;;
19|2?) echo "Boa noite!";;
*) echo "Erro ao solicitar a hora
esac
Estrutura de decisão
Exercícios utilizando a estrutura de decisão (case):
1) Crie um shell script que limpe a tela, forme um menu solicitando a idade do
usuário, e exiba as seguintes informações de acordo com a idade informada:
1-13 Você é uma Criança, vá brincar.
14-17 Adolecente, vá estudar.
18-60 Adulto, vá trabalhar.
61-99 Apto para o clube da melhor idade!
Qualquer outro valor: “Idade inválida!”
Laços
# lista os nomes a partir de uma lista criada em uma variável
nome="joao francisco decio"
for i in $nome
do
echo $i
sleep 1
done
# lista as linhas de um arquivo, aguardando 1 segundo entre uma linha e outra
for i in `cat arquivo`
do
echo $i
sleep 1
done
Laços
# lista o conteúdo do diretório atual
for i in *
# o caracter "*" irá trazer o conteudo do diretório corrente
do
echo $i
sleep 1
done
# Lista números de 1 a 100, aguardando 1 segundo entre um número e outro.
for i in $(seq 1 100)
do
echo $i
sleep 1
done
Laços
# Lista números de 1 a 9
for ((i=1; i<=9; i++))
do
echo -n “$i “
done
# Lista o conteúdo de um array
array=(1 2 3 4 5 6 7 8 9 10)
for i in ${array[*]}
do
i=$[i-1]
echo ${array[$i]}
done
Laços
Exercícios de Fixação utilizando a estrutura de repetição (for):
1) Verifique no sistema quantos usuários existem, quantos são usuários de
sistema (UID abaixo de 1000) e quantos são usuários criados para uso (UID
igual ou acima de 1000). Informe quantos usuários utilizam o bash como shell,
quantos utilizam sh e quantos estão bloqueados para uso com shell (/bin/false).
2) A partir de um diretório, passado por parâmetro, escrever um script que
renomeia todos os arquivos de uma determinada extensão (parâmetro) para
outra extensão.
Exemplo: Todos os arquivos .doc do diretório /tmp alterados para .txt
$ ./renomeia.sh /tmp doc txt
Laços
# Repete a informação enquanto a variável $inicio seja menor que a variável $fim
inicio=1
fim=10
while [ $inicio -lt $fim ]
do
echo "Valor inicial é menor que o final: $inicio $fim"
inicio=$((inicio+1))
done
echo "Valor inicial é igual ao valor final: $inicio $fim"
Laços
# Lê o conteúdo de um arquivo, linha a linha, até o final.
arq=$1
i=0
echo " ------------- Inicio do arquivo. ------------- "
cat $arq | while read LINE
do
i=$((i+1))
echo “Linha $i: $LINE”
done
echo " ------------- Final do arquivo. ------------- "
Laços
# Repete o bloco de comandos enquanto a condição não é satisfeita
# Ou sejam enquanto o usuário cabrito não se logar no sistema o laço não será
# desfeito.
until who | grep cabrito
do
clear
echo "Usuario cabrito nao se logou no sistema"
sleep 2
done
date "+ O usuario cabrito logou-se no sistema em %d/%m/%Y as %H:%M".
Laços
Exercícios utilizando a estrutura de repetição (while/until):
1) Crie um shell script que monitore o tamanho de um diretório, e passar dos
10 MB o script irá enviar um aviso de LOG para o sistema para que o
administrador receba o alerta da hora/minuto que isso ocorreu.
2) Escreva um script que monitore o tamanho de um arquivo, se o arquivo
tiver um tamanho superior a 50 linhas o script irá enviar um aviso de LOG
para o sistema para que o administrador receba o alerta da hora/minuto que
isso ocorreu.
Funções
Funções são aglomerados de comandos que podem ser definidos para uso
posterior em qualquer parte do código. Praticamente todas as linguagens
usam funções que ajudam a organizar o código. Vejamos a sintaxe de uma
função:
nome_da_funcao() {
comandos
}
O corpo das funções devem construídos sempre antes de serem utilizados,
caso contrário, o sistema retornará um erro do tipo “command not found”,
que significa que a função em questão não pode ser encontrada.
Funções
function entrada(){
read -p "Valor inicial: " inicio
read -p "Valor final: " fim
}
entrada
while [ $inicio -ge $fim ]
do
echo "Valor inicial eh maior que o final."
entrada
done
for i in $(seq $inicio $fim)
do
echo "$i"
done
Expressões Regulares
“Expressão regular é um método formal de se especificar um
padrão de texto”
O uso de expressões regulares torna mais rápida a procura pela
informação desejada, quanto mais refinada for a sua construção, mais
preciso e rápido será o resultado.
Expressões Regulares
O que podemos validar com uma expressão regular?
●
Data
●
Horário
●
Endereço IP
●
Endereço de email
●
Endereço de Internet
●
Número de Telefone, RG, CPF, cartão de crédito . . .
●
Dados que estejam no começo ou no final da linha.
Expressões Regulares
Metacaracteres
.?*+^|[]{}()\
.
-
[....] -
Um caracter qualquer
Lista de caracteres permitidos
[^...] - Lista de caracteres não permitidos
?
-
Zero ou um caracter
*
-
Zero, um ou mais caracteres
+ -
Um ou mais
{n,m} – De n até m
^ -
Início da linha
$
Fim da linha
-
Expressões Regulares
Metacaracteres
.?*+^|[]{}()\
\b -
Início ou fim de uma palavra
\c -
Torna literal o caractere c
|
Ou um ou outro
-
(…) - Delimita um grupo
\1...\9 – Texto casado com os grupos 1...9
Expressões Regulares
Exemplos de uso de lista
n[ãa]o
não, nao
[Tt]eclado
teclado, Teclado
e[xs]tendido
estendido, extendido
12[:. ]45
12:45, 12.45, 12 45
Exemplos de uso de lista
n[ãa]o
não, nao
[Tt]eclado
teclado, Teclado
e[xs]tendido
estendido, extendido
12[:. ]45
12:45, 12.45, 12 45
Expressões Regulares
Classes POSIX
Posix é um padrão internacional que define classes de caracteres.
Exemplos de uso:
Classe POSIX Significado
[:upper:] Letras maiúsculas [A­Z]
[:lower:] Letras minúsculas [a­z]
[:alpha:] Letras maiúsculas/minúsculas [A­Za­z]
[:alnum:] Letras Letras e Números [A­Za­z0­9]
[:digit:] Números [0­9]
[:blank:] Espaço e TAB [ \t]
.
.
.
Expressões Regulares
Exemplo de uso de uma expressão regular
#!/bin/bash
a=­10 # zerando a contagem
while [ $a ­lt 350 ] # limitando a amostragem ate 350
do echo $a |
egrep ­x '((1[0­9]|[1­9]?)[0­9]|2([0­4][0­9]|5[0­5]))'
a=$((a+1)) # incrementan a contagem
done
Neste exemplo a variável $a recebe números de ­10 a 349, mas somente mostra na tela valores de 0 a 255. Números típicos usados em um endereço IP.
Expressões Regulares
Exercício de fixação
Com base no exemplo dado escreva um shell script que receba um endereço IP e informe se é um endereço válido ou não.
$ ValidaIP.sh 10.10.10.102
Endereço IP 10.10.10.102 é um endereço Ipv4 válido.
$ ValidaIP.sh 10.10.10.266
O endereço 10.10.10.266 não é um endereço Ipv4 válido.
Expressões Regulares
Classes POSIX
Posix é um padrão internacional que define classes de caracteres.
Exemplos de uso:
Classe POSIX Significado
[:upper:] Letras maiúsculas [A­Z]
[:lower:] Letras minúsculas [a­z]
[:alpha:] Letras maiúsculas/minúsculas [A­Za­z]
[:alnum:] Letras Letras e Números [A­Za­z0­9]
[:digit:] Números [0­9]
[:blank:] Espaço e TAB [ \t]
.
.
.
Shell Script – Exercícios de Fixação
Estudo dirigido
Com base nos conhecimentos apresentados e a fim de fixar é proposto uma lista de exercícios a ser entregue até o dia da prova. Poderão ser aproveitadas as aulas restantes.
Esta lista terá peso 3.0 para avaliação do bimestre. Para obtenção da nota total todos os exercícios deverão estar completos, sem erros de execução, e seus códigos copiados para um trabalho impresso entregue em mãos.
Referências
[ 1 ] JARGAS, Aurélio Marinho. Expressões regulares: uma abordagem
divertida. São Paulo: Novatec Editora, 2008. 2a ed. rev. e ampl.
[ 2 ] NEVES, Júlio César. Curso de Shell Script - Papo de Botequim.
Revista Linux Magazine. Edição 11. Agosto 2005.
[ 3 ] PRITCHARD; PESSANHA; STANGER; DEAN; LANGFELDT. Certificação
Linux LPI. Alta Books. 2007.
[ 4 ] RIBEIRO, Uirá. Certificação Linux. Axcel Books. 2004.
Atribuição-Compartilhamento pela mesma licença 2.5
(http://creativecommons.org/licenses/by-sa/2.5/deed.pt)
Você pode:
copiar, distribuir, exibir e executar a obra
●
criar obras derivadas
●
fazer uso comercial da obra
Sob as seguintes condições:
Atribuição. Você deve dar crédito ao autor original, da forma especificada pelo autor
ou licenciante.
Compartilhamento pela mesma Licença. Se você alterar, transformar, ou criar outra
obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença
idêntica a esta.
●
Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença
desta obra.
●
Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do
autor.
Qualquer direito de uso legítimo (ou "fair use") concedido por lei, ou qualquer outro direito protegido
pela legislação local, não são em hipótese alguma afetados pelo disposto acima.
Este é um sumário para leigos da Licença Jurídica
(na íntegra: http://creativecommons.org/licenses/by-sa/2.5/br/legalcode).
Termo de exoneração de responsabilidade:
http://creativecommons.org/licenses/disclaimer-popup?lang=pt
●
Download

Universidade Tuiuti do Paraná Faculdade de Ciências Exatas