



Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
Você não agüenta mais aquele seu amigo usuário de Linux enchendo o seu saco com aquela história de que o sistema é fantástico e o Shell é uma ferramenta maravilhosa? A partir desta edição vai ficar mais fácil entender o porquê deste entusiasmo... POR JULIO CEZAR NEVES
Tipologia: Notas de estudo
1 / 5
Esta página não é visível na pré-visualização
Não perca as partes importantes!
84 edição 04 www.linuxmagazine.com.br LINUX USER^ Papo de Botequim
aí cara, tentou fazer o exercício que te pedi em nosso último encontro?
você não treinar não aprende. Você me pediu um script para informar se um determinado usuário, cujo nome será passado como parâmetro para o script, está “logado” (arghh!) ou não. Fiz o seguinte: $ cat logado #!/bin/bash
if who | grep $ then echo $1 está logado else echo $1 não está no pedaço fi
cheio de tesão. Primeiro vamos pedir os nossos chopes de praxe e depois vamos ao Shell. Chico, traz dois cho- pes, um sem colarinho!
sos bicos, vamos dar uma olhada nos resultados do seu programa: $ logado jneves jneves pts/0 Oct 18 U 12:02 (10.2.4.144) jneves está logado Realmente funcionou. Passei meu nome de usuário como parâmetro e ele disse que eu estava logado, porém ele imprimiu uma linha extra, que eu não pedi, que é a saída do comando who. Para evitar que isso aconteça, é só mandá-la para o buraco negro do mundo UNIX, o /dev/null. Vejamos então como ficaria: $ cat logado #!/bin/bash
if who | grep $1 > /dev/null then echo $1 está logado else echo $1 não está no pedaço fi Agora vamos aos testes: $ logado jneves jneves está logado $ logado chico chico não está no pedaço Ah, agora sim! Lembre-se dessa pega- dinha: a maior parte dos comandos tem uma saída padrão e uma saída de erros (o grep é uma das poucas exceções: ele não exibe uma mensagem de erro quando não acha uma cadeia de carac- teres) e devemos redirecioná-las para o buraco negro quando necessário. Bem, agora vamos mudar de assunto: na última vez que nos encontramos aqui no botequim, quando já estávamos de goela seca, você me perguntou como se testam condições. Para isso, usamos o comando test Testes Todos estamos acostumados a usar o if para testar condições, e estas são sempre maior que , menor que , maior ou igual a , menor ou igual a , igual a e O garçon já perdeu a conta das cervejas, e o assunto não acaba. Desta vez vamos aprender a testar os mais variados tipos de condições, para podermos controlar a execução de nosso programa de acordo com a entrada fornecida pelo usuário. POR JULIO CEZAR NEVES Curso de Shell Script
botequim IV
Opção Verdadeiro se -e arq arq existe -s arq arq existe e tem tamanho maior que zero -f arq arq existe e é um arquivo regular -d arq arq existe e é um diretório -r arq arq existe e com direito de leitura -w arq arq existe e com direito de escrita -x arq arq existe e com direito de execução Tabela 1 – Opções do test para arquivos Dave Hamilton - www.sxc.hu
��������������������������������������������������
���������������������������������������������������
��������������������������������������������������
���������������������������������������������������
Papo de Botequim LINUX USER ���������������������������������������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ www.linuxmagazine.com.br edição 04 85 diferente de. Para testar condições em Shell Script usamos o comando test , só que ele é muito mais poderoso do que aquilo com que estamos acostuma- dos. Primeiramente, veja na Tabela 1 as principais opções (existem muitas outras) para testar arquivos em disco e na Tabela 2 as principais opções para teste de cadeias de caracteres. Pensa que acabou? Engano seu! Agora é hora de algo mais familiar, as famosas comparações com valores numéricos. Veja a Tabela 3, e some às opções já apresentadas os operadores da Tabela 4. Ufa! Como você viu, tem coisa pra chuchu, e o nosso if é muito mais pode- roso que o dos outros. Vamos ver em uns exemplos como isso tudo funciona. Testamos a existência de um diretório: if test -d lmb then cd lmb else mkdir lmb cd lmb fi No exemplo, testei a existência do diretório lmb. Se não existisse ( else ), ele seria criado. Já sei, você vai criticar a minha lógica dizendo que o script não está otimizado. Eu sei, mas queria que você o entendesse assim, para então poder usar o “ponto-de-espantação” (!) como um negador do test. Veja só: if test! -d lmb then mkdir lmb fi cd lmb Desta forma o diretório lmb seria criado somente se ele ainda não exis- tisse, e esta negativa deve-se ao ponto de exclamação (! ) precedendo a opção -d. Ao fi m da execução desse fragmento de script, com certeza o programa esta- ria dentro do diretório lmb. Vamos ver dois exemplos para entender a diferença na comparação entre números e entre cadeias de caracteres. cad1= cad2= if test $cad1 = $cad then echo As variáveis são iguais. else echo As variáveis são diferentes. fi Executando o fragmento de programa acima, teremos como resultado: As variáveis são diferentes. Vamos agora alterá-lo um pouco para que a comparação seja numérica: cad1= cad2= if test $cad1 -eq $cad then echo As variáveis são iguais. else echo As variáveis são diferentes. fi E vamos executá-lo novamente: As variáveis são iguais. Como você viu, nas duas execuções obtive resultados diferentes, porque a cadeia de caracteres “01” é realmente diferente de “1”. Porém, a coisa muda de figura quando as variáveis são testa- das numericamente, já que o número 1 é igual ao número 01. Para mostrar o uso dos conectores -o (ou) e -a (e), veja um exemplo “animal”, programado direto no prompt do Bash. Me desculpem os zoólogos, mas eu não entendo nada de reino, fi lo, classe, ordem, família, gênero, espécie e outras coisas do tipo, desta forma o que estou chamando de família ou de gênero tem grande chance de estar total e comple- tamente incorreto: $ Familia=felinae $ Genero=gato $ if test $Familia = canidea U -a $Genero = lobo -o $Familia = U 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 e ( -a ) do gênero lobo, ou ( -o ) da familia felina e ( -a ) do gênero leão, seria dado um alerta, caso contrá- rio a mensagem seria de incentivo. Atenção: Os sinais de maior (>) no início das linhas internas ao if são os prompts de continuação (que estão defi nidos na variável $PS2). Quando o shell identifica que um comando con- tinuará na linha seguinte, automatica- mente ele coloca este caractere, até que o comando seja encerrado. Vamos mudar o exemplo para ver se o programa continua funcionando: $ Familia=felino $ Genero=gato $ if test $Familia = felino -o U $Familia = canideo -a $Genero = U onça -o $Genero = lobo then echo Cuidado else echo Pode passar a mão fi Cuidado Obviamente a operação resultou em erro, porque a opção -a tem precedência Opção Verdadeiro se: -z cadeia Tamanho de cadeia é zero -n cadeia Tamanho de cadeia é maior que zero cadeia A cadeia cadeia tem tamanho maior que zero c1 = c2 Cadeia c1 e c2 são idênticas Tabela 2 – Opções do test para cadeias de caracteres Opção Verdadeiro se Significado n1 -eq n2 n1 e n2 são iguais equal n1 -ne n2 n1 e n2 não são iguais not equal n1 -gt n2 n1 é maior que n2 greater than n1 -ge n2 n1 é maior ou igual a n2 greater or equal n1 -lt n2 n1 é menor que n2 less than n1 -le n2 n1 é menor ou igual a n2 less or equal Tabela 3 – Opções do test para números Operador Finalidade Parênteses () 0 Exclamação_!_ 0 -a 0 -o 0 Tabela 4
��������������������������������������������������
���������������������������������������������������
��������������������������������������������������
���������������������������������������������������
Papo de Botequim LINUX USER ���������������������������������������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ www.linuxmagazine.com.br edição 04 87 No primeiro caso, se o primeiro comando (o test, que está represen- tado pelos colchetes) for bem sucedido, isto é, se o diretório lmb não existir, o comando mkdir será executado porque a primeira condição era verdadeira e o conector era e. No exemplo seguinte, testamos se o diretório lmb existia (no anterior testa- mos se ele não existia) e, caso isso fosse verdade, o mkdir não seria executado porque o conector era ou. Outra forma de escrever o programa: cd lmb || mkdir lmb Nesse caso, se o comando cd fosse mal sucedido, o diretório lmb seria criado mas não seria feita a mudança de diretório para dentro dele. Para execu- tar mais de um comando dessa forma, é necessário fazer um grupamento de comandos, o que se consegue com o uso de chaves ( {} ). Veja como seria o modo correto: cd lmb || { mkdir lmb cd lmb } Ainda não está legal porque, caso o diretório não exista, o cd exibirá uma mensagem de erro. Veja o modo certo: cd lmb 2> /dev/null || { mkdir lmb cd lmb } Como você viu, o comando if nos per- mitiu fazer um cd seguro de diversas maneiras. É sempre bom lembrar que o “seguro” a que me refi ro diz respeito ao fato de que ao fi nal da execução você sempre estará dentro de lmb , desde que tenha permissão para entrar neste dire- tório, permissão para criar um subdire- tório dentro de ../lmb , que haja espaço em disco suficiente... Vejamos um exemplo didático: depen- dendo do valor da variável $opc o script deverá executar uma das opções a seguir: inclusão, exclusão, alteração ou encerrar sua execução. Veja como fica- ria o código: 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 U 1 e 4 fi Caractere Significado
������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
��������������������������������������������������
��������������������������������������������������
88 edição 04 www.linuxmagazine.com.br LINUX USER^ Papo de Botequim Neste exemplo você viu o uso do comando elif como um substituto ou forma mais curta de else if. Essa é uma sintaxe válida e aceita, mas poderíamos fazer ainda melhor. Para isso usamos o comando case , cuja sintaxe mostramos a seguir: case $var in padrao1) cmd cmd cmdn ;; padrao2) cmd cmd cmdn ;; padraon) cmd cmd cmdn ;; esac Onde a variável $var é comparada aos padrões padrao1, ..., padraon. Caso um dos padrões corresponda à variável, o bloco de comandos cmd1, ..., cmdn cor- respondente é executado até encontrar um duplo ponto-e-vírgula ( ;; ), quando o fluxo do programa será interrompido e desviado para instrução imediata- mente após o comando esac (que, caso não tenham notado, é case ao contrário. Ele indica o fi m do bloco de código, da mesma forma que ot comando fi indica o fi m de um if ). Na formação dos padrões, são aceitos os caracteres mostrados na Tabela 6. Para mostrar como o código fica melhor, vamos repetir o exemplo ante- rior, só que desta vez usaremos o case em vez do tradicional bloco de código com if ... elif ... else ... fi. case $opc in
coisa (? ), ou ( | ) um seguido de zero ou um ( [01] ), ou seja, esta linha "casa" com 01, 02, ... 09, 10 e 11 ;
de caracteres entre dois e sete, ou seja, esta linha pega 12, 13, ... 17 ;
nenhum dos padrões anteriores.
pouco. Agora eu vou te passar um exercício para você fazer em casa e me dar a resposta da próxima vez em que nos encontrarmos aqui no bote- quim, tá legal?
receba como parâmetro o nome de um arquivo e que quando executado salve esse arquivo com o nome origi- nal seguido de um til (~) e abra esse arquivo dentro do vi para ser editado. Isso é para ter sempre uma cópia de backup do arquivo caso alguém faça alterações indevidas. Obvia- mente, você fará as críticas neces- sárias, como verificar se foi passado um parâmetro, se o arquivo indicado existe... Enfi m, o que te der na telha e você achar que deva constar do script. Deu pra entender?
Julio Cezar Neves é Analista de Suporte de Sistemas desde 1969 e trabalha com Unix desde 1980, quando participou do desenvolvimento do SOX, um sistema operacional similar ao Unix pro- duzido pela Cobra computadores. Pode ser contatado no e-mail julio. neves@gmail.com SOBRE O AUTOR #!/bin/bash
Hora=$(date +%H) case $Hora in 0? | 1[01]) echo Bom Dia ;; 1[2-7] ) echo Boa Tarde ;;