SlideShare une entreprise Scribd logo
1  sur  4
Télécharger pour lire hors ligne
http://olinux.uol.com.br/artigos/286/print_preview.html



                    Curso de Shell - Aula III
                    Por: Alex Borro ( 27/03/2001 )




                        Introdução

                    Nesta terceira parte do nosso curso de shell script, vamos tratar de "condicionais".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.


                        O famoso "if"

                    O bash nos oferece, entre outros, 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?

                    Como foi explicado na aula anterior, 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?
                    Exatamente. Vamos exemplificar:

                    neo@matrix:~$ 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 fizemos?

                    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:

                    neo@matrix:~$ 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".

                    Nós poderíamos omitir a segunda linha dos dois exemplo (a que mostra o conteúdo de /boot no
                    primeiro exemplo e a mensagem de erro emitida pelo ls dizendo que /dir_invalido não existe no
                    segundo), apenas redirecionando as saídas para /dev/null, ou seja:

                    neo@matrix:~$ ls /boot 1> /dev/null 2> /dev/null

                    Nota: Tem um macete que possui o mesmo efeito. Em vez de colocar: "1> /dev/null 2> /dev/null"
                    podemos colocar "2&>1", que é menor e mais simples.
O comando "test"

Bom, aprendemos que o IF avalia a código de retorno de um comando. Mas muitas vezes, para não
dizer a maioria, nós queremos avaliar "expressões", ou seja, verificar se uma variável é igual a outra,
se ela esta vazia etc.

Para isso, nós temos outro comando chamado "test" (intuitivo o nome, não?). Ele funciona da seguinte
maneira: test [expressão].

O test pode testar operações de três tipos: strings, arquivos e aritméticas.

Expressões usando strings:

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:

neo@matrix:~$      test "a" = "a"
neo@matrix:~$      echo $?
0
neo@matrix:~$      test "a" = "b"
neo@matrix:~$      echo $?
1
neo@matrix:~$      test "a" != "b"
neo@matrix:~$      echo $?
0

Aqui comparamos a string "a" com "b". Como era de se esperar, o primeiro retornou verdadeiro (zero),
pois a = a e o segundo retornou falso. No terceiro, o símbolo "!=" significa "diferente".

neo@matrix:~$      test -z "neo"
neo@matrix:~$      echo $?
1
neo@matrix:~$      test -z ""
neo@matrix:~$      echo $?
0
neo@matrix:~$      test -n "neo"
neo@matrix:~$      echo $?
0
neo@matrix:~$      test -n ""
neo@matrix:~$      echo $?
1

Acima 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. Já no segundo caso, como "" é vazia,
retorna verdadeiro. O terceiro e quarto são semelhantes aos primeiros, mas com "-n".

Expressões com arquivos:

Os testes que podem ser feitos com arquivos são para verificar determinadas caracteristicas, como se
ele existe, se é executavel, 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):

neo@matrix:~$      test -e /vmlinuz
neo@matrix:~$      echo $?
0
neo@matrix:~$      test -d /vmlinuz
neo@matrix:~$      echo $?
1
neo@matrix:~$      test -e /usr
neo@matrix:~$      echo $?
0
neo@matrix:~$      test -d /usr
neo@matrix:~$      echo $?
0
neo@matrix:~$      test /usr -nt /vmlinuz
neo@matrix:~$      echo $?
0
neo@matrix:~$      test /usr -ot /vmlinuz
neo@matrix:~$      echo $?
1




   O comando "test" (continuação)

A seguir, temos uma lista de várias opções disponíveis:


    q   -b arquivo - Verdadeiro se arquivo é um arquivo de bloco, como /dev/hda.
    q   -c arquivo - Verdadeiro se arquivo é um arquivo de caracter, como /dev/tty1.
    q   -d arquivo - Verdadeiro se arquivo é um diretório.
    q   -e arquivo - Verdadeiro se arquivo existe.
    q   -f arquivo - Verdadeiro se arquivo existe e é um arquivo comum.
    q   -s arquivo - Verdadeiro se arquivo existe e não é vazio.
    q   -h arquivo - Verdadeiro se arquivo é um link simbólico.
    q   -p arquivo - Verdadeiro se arquivo é um "named pipe" (fifo, lifo, etc).
    q   -S arquivo - Verdadeiro se arquivo é um "socket".
    q   -k arquivo - Verdadeiro se arquivo tem seu "sticky bit" ligado.
    q   -r arquivo - Verdadeiro se arquivo pode ser lido pelo usuário atual.
    q   -w arquivo - Verdadeiro se arquivo pode ser escrito pelo usuário atual.
    q   -x arquivo - Verdadeiro se arquivo pode ser executado pelo usuário atual.
    q   -O arquivo - Verdadeiro se arquivo pertence ao usuário atual.
    q   -G arquivo - Verdadeiro se arquivo pertence ao grupo do usuário atual.
    q   -N arquivo - Verdadeiro se arquivo foi modificado desde a ultima vez que foi lido.


Expressões Aritméticas

Expressões aritméticas consistem com comparar dois números, verificando se são iguais, ou se o
primeiro é maior que o segundo etc.

Infelizmente não podemos apenas utilizar os símbolos conhecidos para igual (=), maior que (>), menor
que (<) etc. Temos que usar operadores reconhecidos pelo "test". Assim, não podemos fazer: "test 1 =
1", devemos utilizar o operador "-eq" (equal): "test 1 -eq 1". A seguir, temos uma lista dos operadores:


    q   -eq (equal): Igual;
    q   -ne (not-equal): Não Igual (diferente);
    q   -lt (less than): Menor que (<);
    q   -le (less than or equal): Menor ou igual ( <= );
    q   -gt (greater than): Maior que (>);
    q   -ge (greater than or equal): Maior ou igual (>=);


Alguns exemplos:

neo@matrix:~$      test 1 -lt 2
neo@matrix:~$      echo $?
0
neo@matrix:~$      test 1 -gt 2
neo@matrix:~$      echo $?
1
neo@matrix:~$      test 2 -gt 1
neo@matrix:~$      echo $?
0
neo@matrix:~$      test 2 -ge 2
neo@matrix:~$      echo $?
0
Para finalizar, vamos fazer duas considerações. A primeira é de que o comando "test" pode ser
substituido por um par de colchetes [ ]. Assim, o comando test "a" = "b" pode ser escrito como [ "a"
= "b" ] .

Essa segunda nomenclatura fica mais fácil e simples, principalmente quando estamos utilizando IF:

if [ -e /vmlinuz ]; é mais intuitivo e simples que if test -e /vmlinuz; .

A segunda consideração é que, obviamente, podemos utilizar variáveis no lugar dos argumentos (caso
contrário, ficaria difícil utilizar comandos de condicionais em shell script). Assim, se tivermos duas
variaveis, valor1=5 e valor2=8:

[ "$valor1" = "$valor2" ] , [ "$valor1" -lt "$valor2" ] etc.

É importante colocarmos os valores entre aspas duplas ("), pois assim o bash pode substituir o que se
encontra dentro dessas aspas. Se colocarmos entre aspas simples ('), impedimos o bash de alterar o
que se encontra dentro delas. Se não utilizarmos as aspas duplas, vamos ter problemas, principalmente
ao trabalharmos com string.

Por exemplo, queremos comparar dois nomes, que se encontram em duas variaveis:nome1="fulano de
tal" e nome2="ciclano".Montando nossa expressão condicional: [ "$nome1" = "$nome2" ].O bash irá
expandir isso para: [ "fulano de tal" = "ciclano" ], ficando claramente definidos o primeiro e o segundo
argumento.

Agora, se não usarmos aspas: [ $nome1 = $nome2 ]. O bash irá expandir isso para: [ fulano de tal =
ciclano ]. Perceba que os argumentos se misturam e o bash não vai saber o que comparar.Por isso é
importante colocarmos os argumentos entre aspas duplas.


   Conclusão

Resumindo, aprendemos na aula de hoje como utilizar comandos condicionais. Isso será fundamental
nas proximas aulas, onde iremos tratar os comandos de laço, como o while. Não perca!




                                 Copyright (C) 1999- 2 0 0 0 Linux Solutions

Contenu connexe

Tendances

Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratosMaurício Linhares
 
Introduction to linux
Introduction to linuxIntroduction to linux
Introduction to linuxguilhermeoki
 
007 programando em python - funcoes
007   programando em python - funcoes007   programando em python - funcoes
007 programando em python - funcoesLeandro Barbosa
 
Redirecionamento, pipes e processos linux
Redirecionamento, pipes e processos   linuxRedirecionamento, pipes e processos   linux
Redirecionamento, pipes e processos linuxFábio dos Reis
 
Conceitos base de programação - parte 2
Conceitos base de programação - parte 2Conceitos base de programação - parte 2
Conceitos base de programação - parte 2João Piedade
 
Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Ivan Ricarte
 
Quarto Trabalho Pm 2009 2
Quarto Trabalho Pm 2009 2Quarto Trabalho Pm 2009 2
Quarto Trabalho Pm 2009 2guestf9707e1
 
Java recursos avançados - streams
Java   recursos avançados - streamsJava   recursos avançados - streams
Java recursos avançados - streamsArmando Daniel
 
Programando em python arquivos
Programando em python   arquivosProgramando em python   arquivos
Programando em python arquivossamuelthiago
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismoMaurício Linhares
 

Tendances (19)

Cap1 exercicios comandos linux
Cap1 exercicios comandos linuxCap1 exercicios comandos linux
Cap1 exercicios comandos linux
 
Lab ect 02 pt
Lab ect 02 ptLab ect 02 pt
Lab ect 02 pt
 
Aula de Prolog 06 - Recursão
Aula de Prolog 06 - RecursãoAula de Prolog 06 - Recursão
Aula de Prolog 06 - Recursão
 
Lpi+102
Lpi+102Lpi+102
Lpi+102
 
Algoritmos - Aula 16 B - Arquivos
Algoritmos - Aula 16 B - ArquivosAlgoritmos - Aula 16 B - Arquivos
Algoritmos - Aula 16 B - Arquivos
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratos
 
Introduction to linux
Introduction to linuxIntroduction to linux
Introduction to linux
 
007 programando em python - funcoes
007   programando em python - funcoes007   programando em python - funcoes
007 programando em python - funcoes
 
Redirecionamento, pipes e processos linux
Redirecionamento, pipes e processos   linuxRedirecionamento, pipes e processos   linux
Redirecionamento, pipes e processos linux
 
Editor de texto VI
Editor de texto VIEditor de texto VI
Editor de texto VI
 
Conceitos base de programação - parte 2
Conceitos base de programação - parte 2Conceitos base de programação - parte 2
Conceitos base de programação - parte 2
 
Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Princípios da organização de código fonte C++
Princípios da organização de código fonte C++
 
Shell script
Shell scriptShell script
Shell script
 
Quarto Trabalho Pm 2009 2
Quarto Trabalho Pm 2009 2Quarto Trabalho Pm 2009 2
Quarto Trabalho Pm 2009 2
 
Relatorio
RelatorioRelatorio
Relatorio
 
Java recursos avançados - streams
Java   recursos avançados - streamsJava   recursos avançados - streams
Java recursos avançados - streams
 
Programando em python arquivos
Programando em python   arquivosProgramando em python   arquivos
Programando em python arquivos
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 
SAC - Aula 1
SAC - Aula 1SAC - Aula 1
SAC - Aula 1
 

En vedette (20)

Economix
EconomixEconomix
Economix
 
Calendar
CalendarCalendar
Calendar
 
AmicusHorizon October2010
AmicusHorizon October2010AmicusHorizon October2010
AmicusHorizon October2010
 
Take the time
Take the timeTake the time
Take the time
 
Primero lo primero
Primero lo primeroPrimero lo primero
Primero lo primero
 
MUSICA
MUSICAMUSICA
MUSICA
 
Christian Bouter - Advieskeuze.nl
Christian Bouter - Advieskeuze.nlChristian Bouter - Advieskeuze.nl
Christian Bouter - Advieskeuze.nl
 
Nos lo dijo_pepe-cuento
Nos lo dijo_pepe-cuentoNos lo dijo_pepe-cuento
Nos lo dijo_pepe-cuento
 
Pure Lighting
Pure LightingPure Lighting
Pure Lighting
 
Percha para lectura
Percha para lecturaPercha para lectura
Percha para lectura
 
2011 edn conf cartooning
2011 edn conf cartooning2011 edn conf cartooning
2011 edn conf cartooning
 
An introduction to NYPD - Nigel Yates Plumbing Dept
An introduction to NYPD - Nigel Yates Plumbing DeptAn introduction to NYPD - Nigel Yates Plumbing Dept
An introduction to NYPD - Nigel Yates Plumbing Dept
 
Presentation v2
Presentation v2Presentation v2
Presentation v2
 
El hada estrellas
El hada estrellasEl hada estrellas
El hada estrellas
 
het dynamiet van het Evangelie
het dynamiet van het Evangeliehet dynamiet van het Evangelie
het dynamiet van het Evangelie
 
Pr2
Pr2Pr2
Pr2
 
Enlamente
EnlamenteEnlamente
Enlamente
 
Arnes andador.
Arnes andador.Arnes andador.
Arnes andador.
 
Tijeras adaptadas con_agarre_multiple
Tijeras adaptadas con_agarre_multipleTijeras adaptadas con_agarre_multiple
Tijeras adaptadas con_agarre_multiple
 
Compromiso Con La Escuela Benigna
Compromiso Con La Escuela BenignaCompromiso Con La Escuela Benigna
Compromiso Con La Escuela Benigna
 

Similaire à Curso Shell - Condicionais IF e TEST

Curso de shell
Curso de shellCurso de shell
Curso de shellTiago
 
Curso de shell
Curso de shellCurso de shell
Curso de shellTiago
 
Curso de ShellScript - Lm05 shellscript5
Curso de ShellScript - Lm05 shellscript5Curso de ShellScript - Lm05 shellscript5
Curso de ShellScript - Lm05 shellscript5Pessoal
 
Oficina de shell script
Oficina de shell scriptOficina de shell script
Oficina de shell scriptbrunobione
 
Linguagem de Programação PERL
Linguagem de Programação PERLLinguagem de Programação PERL
Linguagem de Programação PERLTiago R. Sampaio
 
Introducao a Lógica de Programação
Introducao a Lógica de ProgramaçãoIntroducao a Lógica de Programação
Introducao a Lógica de ProgramaçãoMarcelo Rodrigues
 
Introdução ao shell script no linux
Introdução ao shell script no linuxIntrodução ao shell script no linux
Introdução ao shell script no linuxPaulo Damas
 
Curso de ShellScript - Lm10 shellscript10
Curso de ShellScript - Lm10 shellscript10Curso de ShellScript - Lm10 shellscript10
Curso de ShellScript - Lm10 shellscript10Pessoal
 
Curso de ShellScript - Lm04 shellscript3
Curso de ShellScript - Lm04 shellscript3Curso de ShellScript - Lm04 shellscript3
Curso de ShellScript - Lm04 shellscript3Pessoal
 
Shell Script - Controle de fluxo
Shell Script - Controle de fluxoShell Script - Controle de fluxo
Shell Script - Controle de fluxoFrederico Madeira
 

Similaire à Curso Shell - Condicionais IF e TEST (20)

Curso de shell
Curso de shellCurso de shell
Curso de shell
 
Curso de shell
Curso de shellCurso de shell
Curso de shell
 
Shell Script Linux
Shell Script LinuxShell Script Linux
Shell Script Linux
 
Shell script i
Shell script iShell script i
Shell script i
 
Curso de ShellScript - Lm05 shellscript5
Curso de ShellScript - Lm05 shellscript5Curso de ShellScript - Lm05 shellscript5
Curso de ShellScript - Lm05 shellscript5
 
Oficina de shell script
Oficina de shell scriptOficina de shell script
Oficina de shell script
 
Shell Script v0
Shell Script v0Shell Script v0
Shell Script v0
 
Linguagem de Programação PERL
Linguagem de Programação PERLLinguagem de Programação PERL
Linguagem de Programação PERL
 
Introducao a Lógica de Programação
Introducao a Lógica de ProgramaçãoIntroducao a Lógica de Programação
Introducao a Lógica de Programação
 
Haskell
HaskellHaskell
Haskell
 
Stack based overflow
Stack based overflowStack based overflow
Stack based overflow
 
Linux shell
Linux shellLinux shell
Linux shell
 
Shell Script
Shell ScriptShell Script
Shell Script
 
Comandos de controle de fluxo do php
Comandos de controle de fluxo do phpComandos de controle de fluxo do php
Comandos de controle de fluxo do php
 
Introdução ao shell script no linux
Introdução ao shell script no linuxIntrodução ao shell script no linux
Introdução ao shell script no linux
 
Curso de ShellScript - Lm10 shellscript10
Curso de ShellScript - Lm10 shellscript10Curso de ShellScript - Lm10 shellscript10
Curso de ShellScript - Lm10 shellscript10
 
Curso de ShellScript - Lm04 shellscript3
Curso de ShellScript - Lm04 shellscript3Curso de ShellScript - Lm04 shellscript3
Curso de ShellScript - Lm04 shellscript3
 
Shell Script - Controle de fluxo
Shell Script - Controle de fluxoShell Script - Controle de fluxo
Shell Script - Controle de fluxo
 
3ª aula php
3ª aula php3ª aula php
3ª aula php
 
02 controle de fluxo
02   controle de fluxo02   controle de fluxo
02 controle de fluxo
 

Plus de Felipe Santos

ConheçA O Apache 2.0 Parte 2
ConheçA O Apache 2.0   Parte 2ConheçA O Apache 2.0   Parte 2
ConheçA O Apache 2.0 Parte 2Felipe Santos
 
SegurançA BáSica Do Apache
SegurançA BáSica Do ApacheSegurançA BáSica Do Apache
SegurançA BáSica Do ApacheFelipe Santos
 
Quero Slack! (Parte 3)
Quero Slack! (Parte 3)Quero Slack! (Parte 3)
Quero Slack! (Parte 3)Felipe Santos
 
Quero Slack! (Parte 1)
Quero Slack! (Parte 1)Quero Slack! (Parte 1)
Quero Slack! (Parte 1)Felipe Santos
 
Quero Arch! (Parte 2)
Quero Arch! (Parte 2)Quero Arch! (Parte 2)
Quero Arch! (Parte 2)Felipe Santos
 
Quero Arch! (Parte 1)
Quero Arch! (Parte 1)Quero Arch! (Parte 1)
Quero Arch! (Parte 1)Felipe Santos
 
Conceitos BáSicos Sobre SegurançA Parte 6
Conceitos BáSicos Sobre SegurançA   Parte 6Conceitos BáSicos Sobre SegurançA   Parte 6
Conceitos BáSicos Sobre SegurançA Parte 6Felipe Santos
 
Conceitos BáSicos Sobre SegurançA Parte 4
Conceitos BáSicos Sobre SegurançA   Parte 4Conceitos BáSicos Sobre SegurançA   Parte 4
Conceitos BáSicos Sobre SegurançA Parte 4Felipe Santos
 
Conceitos BáSicos Sobre SegurançA Parte 3
Conceitos BáSicos Sobre SegurançA   Parte 3Conceitos BáSicos Sobre SegurançA   Parte 3
Conceitos BáSicos Sobre SegurançA Parte 3Felipe Santos
 
Conceitos BáSicos Sobre SegurançA Parte 2
Conceitos BáSicos Sobre SegurançA   Parte 2Conceitos BáSicos Sobre SegurançA   Parte 2
Conceitos BáSicos Sobre SegurançA Parte 2Felipe Santos
 
Curso De Shell Aula 6
Curso De Shell   Aula 6Curso De Shell   Aula 6
Curso De Shell Aula 6Felipe Santos
 
Curso De Shell Aula 5
Curso De Shell   Aula 5Curso De Shell   Aula 5
Curso De Shell Aula 5Felipe Santos
 
Compartilhando Internet Via Rádio entre m servidor linux e clientes windows
Compartilhando Internet Via Rádio entre m servidor linux e clientes windowsCompartilhando Internet Via Rádio entre m servidor linux e clientes windows
Compartilhando Internet Via Rádio entre m servidor linux e clientes windowsFelipe Santos
 
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...Felipe Santos
 
Acesso Remoto Para Principiantes
Acesso Remoto Para PrincipiantesAcesso Remoto Para Principiantes
Acesso Remoto Para PrincipiantesFelipe Santos
 
Curso De Algoritmo Aula 10
Curso De Algoritmo   Aula 10Curso De Algoritmo   Aula 10
Curso De Algoritmo Aula 10Felipe Santos
 

Plus de Felipe Santos (20)

ConheçA O Apache 2.0 Parte 2
ConheçA O Apache 2.0   Parte 2ConheçA O Apache 2.0   Parte 2
ConheçA O Apache 2.0 Parte 2
 
SegurançA BáSica Do Apache
SegurançA BáSica Do ApacheSegurançA BáSica Do Apache
SegurançA BáSica Do Apache
 
Quero Slack! (Parte 3)
Quero Slack! (Parte 3)Quero Slack! (Parte 3)
Quero Slack! (Parte 3)
 
Quero Slack! (Parte 1)
Quero Slack! (Parte 1)Quero Slack! (Parte 1)
Quero Slack! (Parte 1)
 
Quero Arch! (Parte 2)
Quero Arch! (Parte 2)Quero Arch! (Parte 2)
Quero Arch! (Parte 2)
 
Quero Arch! (Parte 1)
Quero Arch! (Parte 1)Quero Arch! (Parte 1)
Quero Arch! (Parte 1)
 
Conceitos BáSicos Sobre SegurançA Parte 6
Conceitos BáSicos Sobre SegurançA   Parte 6Conceitos BáSicos Sobre SegurançA   Parte 6
Conceitos BáSicos Sobre SegurançA Parte 6
 
Conceitos BáSicos Sobre SegurançA Parte 4
Conceitos BáSicos Sobre SegurançA   Parte 4Conceitos BáSicos Sobre SegurançA   Parte 4
Conceitos BáSicos Sobre SegurançA Parte 4
 
Conceitos BáSicos Sobre SegurançA Parte 3
Conceitos BáSicos Sobre SegurançA   Parte 3Conceitos BáSicos Sobre SegurançA   Parte 3
Conceitos BáSicos Sobre SegurançA Parte 3
 
Conceitos BáSicos Sobre SegurançA Parte 2
Conceitos BáSicos Sobre SegurançA   Parte 2Conceitos BáSicos Sobre SegurançA   Parte 2
Conceitos BáSicos Sobre SegurançA Parte 2
 
Curso De Shell Aula 6
Curso De Shell   Aula 6Curso De Shell   Aula 6
Curso De Shell Aula 6
 
Curso De Shell Aula 5
Curso De Shell   Aula 5Curso De Shell   Aula 5
Curso De Shell Aula 5
 
Sniffers Parte 3
Sniffers   Parte 3Sniffers   Parte 3
Sniffers Parte 3
 
Sniffers Parte 1
Sniffers   Parte 1Sniffers   Parte 1
Sniffers Parte 1
 
Sniffers Parte 2
Sniffers   Parte 2Sniffers   Parte 2
Sniffers Parte 2
 
Introdução ao Ssh
Introdução ao SshIntrodução ao Ssh
Introdução ao Ssh
 
Compartilhando Internet Via Rádio entre m servidor linux e clientes windows
Compartilhando Internet Via Rádio entre m servidor linux e clientes windowsCompartilhando Internet Via Rádio entre m servidor linux e clientes windows
Compartilhando Internet Via Rádio entre m servidor linux e clientes windows
 
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
 
Acesso Remoto Para Principiantes
Acesso Remoto Para PrincipiantesAcesso Remoto Para Principiantes
Acesso Remoto Para Principiantes
 
Curso De Algoritmo Aula 10
Curso De Algoritmo   Aula 10Curso De Algoritmo   Aula 10
Curso De Algoritmo Aula 10
 

Curso Shell - Condicionais IF e TEST

  • 1. http://olinux.uol.com.br/artigos/286/print_preview.html Curso de Shell - Aula III Por: Alex Borro ( 27/03/2001 ) Introdução Nesta terceira parte do nosso curso de shell script, vamos tratar de "condicionais".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. O famoso "if" O bash nos oferece, entre outros, 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? Como foi explicado na aula anterior, 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? Exatamente. Vamos exemplificar: neo@matrix:~$ 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 fizemos? 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: neo@matrix:~$ 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". Nós poderíamos omitir a segunda linha dos dois exemplo (a que mostra o conteúdo de /boot no primeiro exemplo e a mensagem de erro emitida pelo ls dizendo que /dir_invalido não existe no segundo), apenas redirecionando as saídas para /dev/null, ou seja: neo@matrix:~$ ls /boot 1> /dev/null 2> /dev/null Nota: Tem um macete que possui o mesmo efeito. Em vez de colocar: "1> /dev/null 2> /dev/null" podemos colocar "2&>1", que é menor e mais simples.
  • 2. O comando "test" Bom, aprendemos que o IF avalia a código de retorno de um comando. Mas muitas vezes, para não dizer a maioria, nós queremos avaliar "expressões", ou seja, verificar se uma variável é igual a outra, se ela esta vazia etc. Para isso, nós temos outro comando chamado "test" (intuitivo o nome, não?). Ele funciona da seguinte maneira: test [expressão]. O test pode testar operações de três tipos: strings, arquivos e aritméticas. Expressões usando strings: 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: neo@matrix:~$ test "a" = "a" neo@matrix:~$ echo $? 0 neo@matrix:~$ test "a" = "b" neo@matrix:~$ echo $? 1 neo@matrix:~$ test "a" != "b" neo@matrix:~$ echo $? 0 Aqui comparamos a string "a" com "b". Como era de se esperar, o primeiro retornou verdadeiro (zero), pois a = a e o segundo retornou falso. No terceiro, o símbolo "!=" significa "diferente". neo@matrix:~$ test -z "neo" neo@matrix:~$ echo $? 1 neo@matrix:~$ test -z "" neo@matrix:~$ echo $? 0 neo@matrix:~$ test -n "neo" neo@matrix:~$ echo $? 0 neo@matrix:~$ test -n "" neo@matrix:~$ echo $? 1 Acima 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. Já no segundo caso, como "" é vazia, retorna verdadeiro. O terceiro e quarto são semelhantes aos primeiros, mas com "-n". Expressões com arquivos: Os testes que podem ser feitos com arquivos são para verificar determinadas caracteristicas, como se ele existe, se é executavel, 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): neo@matrix:~$ test -e /vmlinuz neo@matrix:~$ echo $? 0 neo@matrix:~$ test -d /vmlinuz neo@matrix:~$ echo $? 1 neo@matrix:~$ test -e /usr neo@matrix:~$ echo $? 0 neo@matrix:~$ test -d /usr neo@matrix:~$ echo $? 0
  • 3. neo@matrix:~$ test /usr -nt /vmlinuz neo@matrix:~$ echo $? 0 neo@matrix:~$ test /usr -ot /vmlinuz neo@matrix:~$ echo $? 1 O comando "test" (continuação) A seguir, temos uma lista de várias opções disponíveis: q -b arquivo - Verdadeiro se arquivo é um arquivo de bloco, como /dev/hda. q -c arquivo - Verdadeiro se arquivo é um arquivo de caracter, como /dev/tty1. q -d arquivo - Verdadeiro se arquivo é um diretório. q -e arquivo - Verdadeiro se arquivo existe. q -f arquivo - Verdadeiro se arquivo existe e é um arquivo comum. q -s arquivo - Verdadeiro se arquivo existe e não é vazio. q -h arquivo - Verdadeiro se arquivo é um link simbólico. q -p arquivo - Verdadeiro se arquivo é um "named pipe" (fifo, lifo, etc). q -S arquivo - Verdadeiro se arquivo é um "socket". q -k arquivo - Verdadeiro se arquivo tem seu "sticky bit" ligado. q -r arquivo - Verdadeiro se arquivo pode ser lido pelo usuário atual. q -w arquivo - Verdadeiro se arquivo pode ser escrito pelo usuário atual. q -x arquivo - Verdadeiro se arquivo pode ser executado pelo usuário atual. q -O arquivo - Verdadeiro se arquivo pertence ao usuário atual. q -G arquivo - Verdadeiro se arquivo pertence ao grupo do usuário atual. q -N arquivo - Verdadeiro se arquivo foi modificado desde a ultima vez que foi lido. Expressões Aritméticas Expressões aritméticas consistem com comparar dois números, verificando se são iguais, ou se o primeiro é maior que o segundo etc. Infelizmente não podemos apenas utilizar os símbolos conhecidos para igual (=), maior que (>), menor que (<) etc. Temos que usar operadores reconhecidos pelo "test". Assim, não podemos fazer: "test 1 = 1", devemos utilizar o operador "-eq" (equal): "test 1 -eq 1". A seguir, temos uma lista dos operadores: q -eq (equal): Igual; q -ne (not-equal): Não Igual (diferente); q -lt (less than): Menor que (<); q -le (less than or equal): Menor ou igual ( <= ); q -gt (greater than): Maior que (>); q -ge (greater than or equal): Maior ou igual (>=); Alguns exemplos: neo@matrix:~$ test 1 -lt 2 neo@matrix:~$ echo $? 0 neo@matrix:~$ test 1 -gt 2 neo@matrix:~$ echo $? 1 neo@matrix:~$ test 2 -gt 1 neo@matrix:~$ echo $? 0 neo@matrix:~$ test 2 -ge 2 neo@matrix:~$ echo $? 0
  • 4. Para finalizar, vamos fazer duas considerações. A primeira é de que o comando "test" pode ser substituido por um par de colchetes [ ]. Assim, o comando test "a" = "b" pode ser escrito como [ "a" = "b" ] . Essa segunda nomenclatura fica mais fácil e simples, principalmente quando estamos utilizando IF: if [ -e /vmlinuz ]; é mais intuitivo e simples que if test -e /vmlinuz; . A segunda consideração é que, obviamente, podemos utilizar variáveis no lugar dos argumentos (caso contrário, ficaria difícil utilizar comandos de condicionais em shell script). Assim, se tivermos duas variaveis, valor1=5 e valor2=8: [ "$valor1" = "$valor2" ] , [ "$valor1" -lt "$valor2" ] etc. É importante colocarmos os valores entre aspas duplas ("), pois assim o bash pode substituir o que se encontra dentro dessas aspas. Se colocarmos entre aspas simples ('), impedimos o bash de alterar o que se encontra dentro delas. Se não utilizarmos as aspas duplas, vamos ter problemas, principalmente ao trabalharmos com string. Por exemplo, queremos comparar dois nomes, que se encontram em duas variaveis:nome1="fulano de tal" e nome2="ciclano".Montando nossa expressão condicional: [ "$nome1" = "$nome2" ].O bash irá expandir isso para: [ "fulano de tal" = "ciclano" ], ficando claramente definidos o primeiro e o segundo argumento. Agora, se não usarmos aspas: [ $nome1 = $nome2 ]. O bash irá expandir isso para: [ fulano de tal = ciclano ]. Perceba que os argumentos se misturam e o bash não vai saber o que comparar.Por isso é importante colocarmos os argumentos entre aspas duplas. Conclusão Resumindo, aprendemos na aula de hoje como utilizar comandos condicionais. Isso será fundamental nas proximas aulas, onde iremos tratar os comandos de laço, como o while. Não perca! Copyright (C) 1999- 2 0 0 0 Linux Solutions