Programação Shell LinuxAqui temos um livro livre e completo sobre ShellOs sedentos do "saber livre" são muito benvindos. |
Comandos Shell Script |
||
Home | Artigos | Agradecimentos | Links Amigos | Comprar o livroChangelogs |
Papo de Botequim - Parte 1Papo de Botequim - Parte 2Papo de Botequim - Parte 3Papo de Botequim - Parte 4Papo de Botequim - Parte 5Papo de Botequim - Parte 6Papo de Botequim - Parte 7Papo de Botequim - Parte 8Papo de Botequim - Parte 9Papo de Botequim - Parte 10Papo de Botequim - Parte 11Tira Gosto |
Papo de Botequim - Parte IV- E aí cara, tentou fazer o exercício que te pedi para revigorar as idéias? - Claro, que sim! Em programação, se você não treinar, não aprende. Você me pediu para fazer um scriptizinho para informar se um determinado usuário, que será passado como parâmetro esta logado (arghh!) ou não. Eu fiz o seguinte: $ cat logado
#!/bin/bash
# Pesquisa se uma pessoa está logada ou não
if who | grep $1
then
echo $1 está logado
else
echo $1 não se encontra no pedaço
fi
- Calma rapaz! Já vi que você chegou cheio de tesão, primeiro vamos pedir os nossos chopes de praxe e depois vamos ao Shell. Chico traz dois chopes, um sem colarinho! - Agora que já molhamos os nossos bicos, vamos dar uma olhadinha na execução do seu bacalho: $ logado jneves
jneves pts/0 Oct 18 12:02 (10.2.4.144)
jneves está logado
Realmente funcionou. Passei o meu login como parâmetro e ele disse que eu estava logado, porém ele mandou uma linha que eu não pedi. Esta linha é a saída do comando $ cat logado
#!/bin/bash
# Pesquisa se uma pessoa está logada ou não (versão 2)
if who | grep $1 > /dev/null
then
echo $1 está logado
else
echo $1 não se encontra no pedaço
fi
Agora vamos aos testes: $ logado jneves
jneves está logado
$ logado chico
chico não se encontra no pedaço
Ah, agora sim! Lembre-se desta pegadinha, a maior parte dos comandos tem uma saída padrão e uma saída de erros (o
grep é uma das poucos exceções, já que não dá mensagem de erro quando não acha uma cadeia) e é necessário estarmos atentos para redirecioná-las para o buraco negro quando necessário.
Bem, agora vamos mudar de assunto: na última vez que nos encontramos aqui no Botequim, eu estava te mostrando os comandos condicionais e, quando já estávamos de goela seca falando sobre o if, você me perguntou como se testa condições. Vejamos então o O Comando test
Bem, todos estamos acostumados a usar o
Veja agora as principais opções para teste de cadeias de caracteres:
E pensa que acabou? Engano seu! Agora é que vem o que você está mais acostumado, ou seja as famosas comparações com numéricos. Veja a tabela:
Além de tudo, some-se a estas opções as seguintes facilidades:
Ufa! Como você viu tem coisa prá chuchu, e como eu te disse no início, o nosso Exemplos: if test -d lmb then cd lmb else mkdir lmb cd lmb fi
No exemplo, testei se existia um diretório if test ! -d lmb then mkdir lmb fi cd lmb
Desta forma o diretório Vamos ver dois exemplos para entender a diferença comparação entre números e entre cadeias. cad1=1 cad2=01 if test $cad1 = $cad2 then echo As variáveis são iguais. else echo As variáveis são diferentes. fi Executando o fragmento de programa acima vem:
Vamos agora alterá-lo um pouco para que a comparação seja numérica: cad1=1 cad2=01 if test $cad1 -eq $cad2 then echo As variáveis são iguais. else echo As variáveis são diferentes. fi E vamos executá-lo novamente:
Como você viu nas duas execuções obtive resultados diferentes porque a cadeia Exemplos:
Para mostrar o uso dos conectores $ Familia=felinae
$ Genero=gato
$ if test $Familia = canidea -a $Genero = lobo -o $Familia = felina -a $Genero = leão
> then
> echo Cuidado
> else
> echo Pode passar a mão
> fi
Pode passar a mão
Neste exemplo caso o animal fosse da família canídea
Os sinais de maior (
> ) no início das linhas internas ao if são os prompts de continuação (que estão definidos na variável $PS2 ) e quando o Shell identifica que um comando continuará na linha seguinte, automaticamente ele o coloca até que o comando seja encerrado.
Vamos mudar o exemplo para ver se continua funcionando: $ Familia=felino
$ Genero=gato
$ if test $Familia = felino -o $Familia = canideo -a $Genero = onça -o $Genero = lobo
> then
> echo Cuidado
> else
> echo Pode passar a mão
> fi
Cuidado
Obviamente a operação redundou em erro, isto foi porque a opção
Que foi avaliada como falsa, retornando o seguinte:
Que resolvida vem:
Como agora todos conectores são $ if test \($Familia = felino -o $Familia = canideo\) -a \($Genero = onça -o $Genero = lobo\)
> then
> echo Cuidado
> else
> echo Pode passar a mão
> fi
Pode passar a mão
Desta forma, com o uso dos parênteses agrupamos as expressões com o conector
Para que seja
Se quisermos escolher um CD que tenha faixas de 2 artistas diferentes, nos sentimos tentados a usar um $ grep Artista1 musicas | grep Artista2
Da mesma forma para escolhermos CDs que tenham a participação do $ egrep (Artista1|Artista2) musicas
Ou (nesse caso específico) o próprio $ grep Artista[12] musicas
No - Tá legal, eu aceito o argumento, o - É você tem razão, eu também não gosto disso e acho que ninguém gosta. Acho que foi por isso, que o Shell incorporou outra sintaxe que substitui o comando Exemplos: Para isso vamos pegar aquele exemplo para fazer uma troca de diretórios, que era assim: if test ! -d lmb then mkdir lmb fi cd lmb e utilizando a nova sintaxe, vamos fazê-lo assim: if [ ! -d lmb ] then mkdir lmb fi cd lmb
Ou seja, o comando Querida, Encolheram o Comando CondicionalSe você pensa que acabou, está muito enganado. Repare a tabela (tabela verdade) a seguir:
Ou seja, quando o conector é
Ora, os caras que desenvolveram o interpretador não são bobos e estão sempre tentando otimizar ao máximo os algoritmos. Portanto, no caso do conector
Aproveitando disso, criaram uma forma abreviada de fazer testes. Batizaram o conector if [ ! -d lmb ] then mkdir lmb fi cd lmb Isso também poderia ser escrito da seguinte maneira: [ ! -d lmb ] && mkdir lmb cd lmb
Ou ainda retirando a negação (
[ -d lmb ] || mkdir lmb cd lmb
No primeiro caso, se o primeiro comando (o
No exemplo seguinte, testamos se o diretório
Neste caso, se o cd lmb || { mkdir lmb cd lmb }
Ainda não está legal, porque caso o diretório não exista, o cd lmb 2> /dev/null || { mkdir lmb cd lmb }
Como você viu o comando E tome de test
Ufa! Você pensa que acabou? Ledo engano! Ainda tem uma forma de
Onde
$ echo $H
13
$ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora inválida
Hora inválida
$H=12
$ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora inválida
$
Neste exemplo, testamos se o conteúdo da variável Exemplos: Para saber se uma variável tem o tamanho de um e somente um caractere, faça:
$ var=a
$ [[ $var == ? ]] && echo var tem um caractere
var tem um caractere
$ var=aa
$ [[ $var == ? ]] && echo var tem um caractere
$
Como você pode imaginar, este uso de padrões para comparação, aumenta muito o poderio do comando Acaso Casa com case
Vejamos um exemplo didático: dependendo do valor da variável if [ $opc -eq 1 ] then inclusao elif [ $opc -eq 2 ] then exclusao elif [ $opc -eq 3 ] then alteracao elif [ $opc -eq 4 ] then exit else echo Digite uma opção entre 1 e 4 fi
Neste exemplo você viu o uso do case $var in padrao1) cmd1 cmd2 cmdn ;; padrao2) cmd1 cmd2 cmdn ;; padraon) cmd1 cmd2 cmdn ;; esac
Onde a variável Na formação dos padrões, são aceitos os seguintes caracteres:
Para mostrar como fica melhor, vamos repetir o exemplo anterior, só que desta vez usaremos o case $opc in 1) inclusao ;; 2) exclusao ;; 3) alteracao ;; 4) exit ;; *) echo Digite uma opção entre 1 e 4 esac
Como você deve ter percebido, eu usei o asterisco como a última opção, isto é, se o asterisco atende a qualquer coisa, então ele servirá para qualquer coisa que não esteja no intervalo de 1 a 4. Outra coisa a ser notada é que o duplo ponto-e-vírgula não é necessário antes do Exemplos: Vamos agora fazer um script mais radical. Ele te dará bom dia, boa tarde ou boa noite dependendo da hora que for executado, mas primeiramente veja estes comandos: $ date
Tue Nov 9 19:37:30 BRST 2004
$ date +%H
19
O comando $ cat boasvindas.sh
#!/bin/bash
# Programa bem educado que
# dá bom-dia, boa-tarde ou
# boa-noite conforme a hora
Hora=$(date +%H)
case $Hora in
0? | 1[01]) echo Bom Dia
;;
1[2-7] ) echo Boa Tarde
;;
* ) echo Boa Noite
;;
esac
exit
Peguei pesado, né? Que nada vamos esmiuçar a resolução caso-a-caso (ou seria case-a-case? )
- Cara, até agora eu falei muito e bebi pouco. Agora eu vou te passar um exercício para você fazer em casa e me dar a resposta da próxima vez que nos encontrarmos aqui no botequim, tá legal? - Tá, mas antes informe ao pessoal que está acompanhando este curso conosco como eles podem te encontrar para fazer críticas, contar piada, convidar para o chope, curso ou palestra ou até mesmo para falar mal dos políticos. - É fácil, meu e-mail é julio.neves@gmail.com, mas pare de me embromar que eu não vou esquecer de te passar o script para fazer. É o seguinte: quero que você faça um programa que receberá como parâmetro o nome de um arquivo e que quando executado salvará este arquivo com o nome original seguido de um til ( - Hum, hum... - Chico! Traz mais um sem colarinho que o cara aqui já está dando para entender! Vou aproveitar também para mandar o meu jabá: diga para os amigos que quem estiver afim de fazer um curso porreta de programação em Shell que mande um e-mail para a nossa gerencia de treinamento para informar-se. Qualquer dúvida ou falta de companhia para um chope ou até para falar mal dos políticos é só mandar um e-mail para mim. Valeu! -- EvandroPastor - 19 Sep 2005 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Licença Creative Commons - Atribuição e Não Comercial (CC) 2009 Pelos Frequentadores do Bar do Júlio Neves. Todo o conteúdo desta página pode ser utilizado segundo os termos da Creative Commons License: Atribuição-UsoNãoComercial-PermanênciaDaLicença. |