http://www.zago.eti.br/script/formas-de-if.txt Use CTRL+F para refinar a pesquisa. Linha de: **************** separa mensagens ou tópicos. ******************************************************** Zago http://www.zago.eti.br/menu.html FAQ e artigos sobre Linux ******************************************************** ******************************************************** ******************************************************** ******************************************************** ******************************************************** Rotina para desligar servidor na queda de energia e backup após o expediente. Ambiente: Serivdor Samba com 4 estações windows, uma delas com dual-boot. No-break somente no servidor. Objetivo: Desligar o servidor quando faltar energia ou fazer backup quando somente a estação Linux responder ao ping. O servidor testa a cada 5 minutos se alguma estação win responde, quando nenhuma responder ao ping então desliga o servidor, quando somente a estação Linux responder, então faça o backup e depois desliga o servidor. No final do expediente a maquina com dual-boot é reiniciada com boot pelo Linux. cat /root/testarede.sh #!/bin/bash cd /root ping -c1 192.168.1.11 &>/dev/null if [ $? = 0 ]; then exit fi ping -c1 192.168.1.12 &>/dev/null if [ $? = 0 ]; then exit fi ping -c1 192.168.1.13 &>/dev/null if [ $? = 0 ]; then exit fi ping -c1 192.168.1.14 &>/dev/null if [ $? = 0 ]; then exit fi # testa a maquina do backup, se OK faz backup, senão desliga. ping -c1 192.168.1.53 &>/dev/null if [ $? = 0 ]; then # fazer backup - inclua aqui seus comandos de backup echo "backup efetuado com sucesso! " >> /root/logbackup.txt fi poweroff Para agendar a execução a cada 5 minutos, execute "crotab -e" como neste exemplo: */5 * * * * /root/testarede.sh Este é um exemplo bem simples, existem outras formas de implementar o teste das maquinas ligadas, tudo depende da sua rede e o que deseja fazer. ******************************************************** ******************************************************** De:  julio henrique Para:  linux-br@bazar2.conectiva.com.br Cc:  SWQuality Assunto:  Re: (linux-br)=?iso-8859-1?q?Compila=E7=E3o=20e=20m=F3dulos=20de=20m=FAltiplos?= kernels Data:  Sat, 21 Feb 2004 09:56:50 -0300 Oi, andrade, acho que entendi o que vc quer fazer... dentro do man modules.conf, existem umas partes obscuras e esotéricas... vc pode colocar uma estrutura de programacao junto... um exemplo: ------modules.conf #### modulos para o kernel 2.4.21### if `kernelversion` <= 2.4.21 alias parport_lowlevel parport_pc # alias block-major-58 lvm-mod # alias block-major-109 lvm-mod alias block-major-43 off alias loop0 loop alias char-major-108 ppp_generic alias /dev/ppp ppp_generic alias tty-ldisc-3 ppp_async alias tty-ldisc-14 ppp_synctty alias ppp-compress-21 bsd_comp alias ppp-compress-24 ppp_deflate alias ppp-compress-26 ppp_deflate alias ppp ppp_async alias rtl8139 8139too # alias autofs autofs4 alias usb usb-uhci alias eth0 8139too alias sound-slot-0 es1370 post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || : pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || : endif #### modulos para o kernel 2.4.21### elsif `kernelversion` > 2.6.1 alias loop0 loop endif ---------final de modules.conf------------- vc pode colocar if, else e  elsif. pode tbm fazer assim: if -f /home/diretorio/arquivo_obscuro alias sound-slot-0 es1370 usb-uhci endif só testei com =, <, > ... não testei com lt, gt, ne, eq, le,ge..... Divirta-se!!!!! rs [ ]s, julio -- ==================================================== IMECC/UNICAMP Instituto de 'Matemágica' e Computação Científica Universidade Estadual de Campinas ---------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++ Linux Registered User  86405 - Since dez/1997 ******************************************************** De:  Dicas-L-Owner@unicamp.br Assunto:  [Dicas-L] Formas de if Data:  Tue, 01 Jul 2003 02:33:27 -0300 -------------------------------------------------------------------- Endereço: http://www.Dicas-l.com.br/dicas-l/20030701.shtml -------------------------------------------------------------------- PostgreSQL: Introdução ao Banco de Dados Campinas: 7 e 8 de julho São Paulo: 10 e 11 de julho Mais informações http://www.dextra.com.br/servicos/treinamento/pg/postgres.htm -------------------------------------------------------------------- Formas de if ============ Colaboração Júlio Cezar Neves O Júlio Cezar, autor do melhor livro de programação shell que conheço :-) me enviou alguns comentários a respeito de uma dica que escrevi com base em uma palestra dele que assisti no IV Fórum Internacional de Software Livre, em Porto Alegre. O livro de Programação Shell do Júlio pode ser encontrado em http://www.brasport.com.br/livro.asp?Cod=85-7452-118-3 Gostaria de agradecer ao Júlio por compartilhar seus grandes conhecimentos e seu eterno bom humor conosco :-) A seguir, a mensagem do Júlio: --------------------------------------------------------------------- Formas de if ============ Júlio Cezar Neves Como eu havia te prometido ai vai uma série de formas de executar a mesma tarefa: - Forma 1 - =========== #!/bin/bash if cd dir 2> /dev/null then >a; >b; >c ls -l else mkdir dir cd dir >a; >b; >c ls -l fi pwd Observações da Forma 1: ======================= Neste exemplo, tirei partido da característica do comando if que diferentemente dos ifs das linguagens tradicionais não testa uma condição, mas sim a instrução a ele associada, isto é, caso o cd seja bem sucedido (e o será se já existir o diretório dir), a seqüência do programa será pelo then, caso contrário pelo else. Repare que neste script não usei o touch, usei o redirecionamento da saída padrão (>) para criar os arquivos (a, b e c) sem onerar o kernel, ganhando na execução. O ponto-e-vírgula serve para colocar mais de um comando na mesma linha. O pwd ao final foi colocado para mostrar que o ls foi feito de dentro do diretório dir, pois qdo termina a execução do script (que estava sendo executado em um sub-shell) vc estará novamente no diretório do shell pai. Se vc executar somente do if ao fi no prompt de comando, ele permanecerá em dir pq não foi criado um sub-shell. - Forma 2 - =========== #!/bin/bash if test -d dir then >a; >b; >c ls -l else mkdir dir cd dir >a; >b; >c ls -l fi pwd Observações da Forma 2: ======================= Neste caso, utilizei o cmd test que serve para testar condições. Além das condições tradicionais (maior, menor, igual, diferente, maior-ou-igual, ...) este cmd também possui diversas opções para testar arquivos e diretórios (neste caso, a opção -d foi usada para verificar se havia um diretório dir definido). Observe que o if continua testando a execução de uma instrução, no caso o test. Como esta construção é muito feia e xquisita, foi implementado um alias para o cmd test, que consiste em colocar o escopo da instrução entre um par de colchetes, embelezando e tornando a leitura mais fácil. Assim sendo, o script abaixo é exatamente igual ao anterior, e por isso não será chamado de forma 3. #!/bin/bash if [ -d dir ] then >a; >b; >c ls -l else mkdir dir cd dir >a; >b; >c ls -l fi pwd - Forma 3 - #!/bin/bash cd dir 2> /dev/null || { mkdir dir cd dir } >a; >b; >c ls -l pwd ==Observações da Forma 3:== Neste caso uma construção maluca! Vejam só a criatividade que o shell permite! O conector || significa um ou lógico (o e lógico é &&), então como sabemos que verdadeiro ou qualquer coisa (falso, verdadeiro) resultará em verdadeiro, a otimização do shell qdo encontra verdadeiro, não executa o que segue o ou. Ao contrário, se o primeiro membro for falso o segundo será executado. Desta forma, caso não haja o diretório dir (o cd dir resultará falso), o conector || fará com que o bloco de programa entre as chaves ({}) seja executado. --------------------------------------------------------------- As mensagens da lista Dicas-L são veiculadas diariamente para 21781 assinantes. Todas as mensagens da Dicas-L ficam armazenadas em http://www.Dicas-l.com.br. A redistribuição desta e outras mensagens da lista Dicas-L pode ser feita livremente, deste que o conteúdo, inclusive esta nota, não sejam modificados. --------------------------------------------------------------- ******************************************************** ******************************************************** De:  dorsolini Para:  lista-linux Assunto:  (linux-br)Simples script para apagar arquivo Data:  Tue, 20 Jan 2004 13:14:33 -0300 ai vai um script simples que fiz para controlar o tamanho da auditoria no meu mailserver.   eh simples e até bobo, mas quebra um galho.   se for util pra alguem ai esta.   Falows.     #!/bin/sh   #tamanho em mega permitido para o log tamanho_maximo=1200;   #grava o tamanho num arquivo tamanho=`du -m /auditoria/auditoria.log > tamanho`;   #obtem apenas o tamanho do arquivo tamanho_arquivo="`cut -c 1-3 tamanho`";   #Condicao que verifica se o tamanho do log nao ultrapassa o permitido if [ $tamanho_maximo -ge $tamanho_arquivo ]; then #Caso verdadeiro o arquivo eh mantido echo "Arquivo de log com tamanho permitido"; else #caso falso o arquivo eh apagado echo "Arquivo de log com tamanho negado"; rm -f /auditoria/auditoria.log fi   -----------------------------------------------------------------------                      Eduardo Pasquotto Orsolini -----------------------------------------------------------------------                www.computec-online.com.br 019 3434-1012 ----------------------------------------------------------------------- ******************************************************** De:  Thiago Macieira Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)if-then em script nãofunciona Data:  Fri, 4 Jun 2004 22:27:25 -0300 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Marcio Katan wrote: >Olá Lista. Tem um bom tempo que não pratico com shell script e comecei > a fazer um script e o "IF" não tá funcionando. Alguém sabe o porquê? > Segue abaixo o script. Qual deles? Você não podia simplificar o script para apenas o caso em que dá problemas? >if [ ! -d $DIR_VPN ]; then >mkdir $DIR_VPN >               if [ ! -d $FILE_IP ]; then >               touch $FILE_IP >               fi >fi Esses aí parecem ok, desde que $DIR_VPN e $FILE_IP não estejam vazios (e não estão). >if [ !$FILE_IP_PPP ]; then >touch $FILE_IP_PPP >fi Esse definitivamente está errado. Não era um if [ ! -f $FILE_IP_PPP ]; ? >if [ "`/sbin/ifconfig | awk '/ppp/'`" ]; then Esse é equivalente a if [ -n ...... ];. Parece correto. >if [ -e $FILE_INDEX ]; then >rm -f "$FILE_INDEX" >touch "$FILE_INDEX" >fi Correto desde que $FILE_INDEX não esteja vazio. >if [ -e $FILE_IP_EXT ]; then >rm -f $FILE_IP_EXT >touch $FILE_IP_EXT >fi Idem. - --   Thiago Macieira  -  Registered Linux user #65028    thiago (AT) macieira (DOT) info     ICQ UIN: 1967141   PGP/GPG: 0x6EF45358; fingerprint: ******************************************************** De:  Carlos Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)if-then em script nãofunciona] Data:  Sat, 05 Jun 2004 10:56:59 -0300 Marcio Katan wrote: Olá Lista. Tem um bom tempo que não pratico com shell script e comecei a fazer > um script e o "IF" não tá funcionando. Alguém sabe o porquê? Segue abaixo o > script. > > >   > Marcio, ifconfig | head -n2 | tail -1 | grep -E "inet" | cut -d: -f #ERRADO Da forma acima o endereco ip nao e pego pois o parametro -d: esta errado. ifconfig |grep Bcast |awk '{print $2}' |cut -d ":" -f2 #CERTO Observe que usei awk e alterei tambem o cut com a flag -d ":" -f2 , onde o f esta colado ao 2 :) #faltou isso: if [ !$FILE_IP_PPP ]; then #ERRADO (bem apontado pelo Thiago) if [ ! -f $FILE_IP_PPP ] ; then  #CERTO  Se arquivo nao existir...entao cria. --------------------------------------------------------------------------------  Tente a versao alterada abaixo! repare em set -x logo ao inicio, use-o para debugar seu scripts.  Use outros lacos como case por exemplo que melhoraria o algoritmo. Abracos e saude. -------------------------------------------------------------------------------- #!/bin/bash #set -x clear DIR_VPN=/etc/vpn FILE_IP=$DIR_VPN/ip_eth0 FILE_IP_PPP=$DIR_VPN/ip_ppp0 FILE_IP_EXT=$DIR_VPN/ip_rto FILE_INDEX=$DIR_VPN/index.html ######################################### # Determinando IP interno - ETH0 ######################################### if [ ! -d $DIR_VPN ]; then mkdir $DIR_VPN                if [ ! -d $FILE_IP ]; then                        touch $FILE_IP                fi fi for IP in "`/sbin/ifconfig |grep Bcast |awk '{print $2}' |cut -d ":" -f2`" ; do echo $IP > $FILE_IP echo "O endereco IP de ETH0 $IP" done if [ !$FILE_IP_PPP ]; then        touch $FILE_IP_PPP fi ######################################### # Determinando IP de PPP0 - host/velox ######################################### if [ "`/sbin/ifconfig | awk '/ppp/'`" ]; then        for IP_PPP in "`/sbin/ifconfig | awk '/ppp0/,/inet end.: / {print $3}' | tail -1`"; do        echo $IP_PPP > $FILE_IP_PPP        echo "O endereco IP de PPP e $IP_PPP" #       break #       else        done fi ######################################### # Determinando IP externo - velox/net ######################################### if [ -e $FILE_INDEX ]; then rm -f "$FILE_INDEX" touch "$FILE_INDEX" fi if [ -e $FILE_IP_EXT ]; then rm -f $FILE_IP_EXT touch $FILE_IP_EXT fi echo "Por favor aguarde, determinando endereco IP externo..." ######################################### # O script abaixo para localizao # do endereco IP externo eh de autoria # de Manuel Pinho - pinho@facil.psi.br ######################################### cd /etc/vpn wget http://www.whatismyip.com/ > $FILE_INDEX IPEXT=`awk '/Your IP is/ {print $4}' $DIR_VPN/index.html` echo $IPEXT > $FILE_IP_EXT echo "O IP externo  $IPEXT" #EOF ------------------------------------------------------------------------------------ Time is nature's way of making sure that everything doesn't happen at once. - SlackWare user #349702 De:  Thiago Macieira Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)if-then em script nãofunciona Data:  Sat, 5 Jun 2004 22:12:37 -0300 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Carlos wrote: >ifconfig | head -n2 | tail -1 | grep -E "inet" | cut -d: -f #ERRADO >ifconfig |grep Bcast |awk '{print $2}' |cut -d ":" -f2 #CERTO >Observe que usei awk e alterei tambem o cut com a flag -d ":" -f2 , > onde o f esta >colado ao 2 :) Desculpe, mas suas duas alterações no cut são trocar seis por meia-dúzia. Você pede para escrever         cut -d ":" -f2 ao invés de         cut -d: -f 2 As duas linhas são idênticas, assim como:         cut -d: -f2         cut -d : -f2 (note que as aspas não chegam ao cut) - --   Thiago Macieira  -  Registered Linux user #65028    thiago (AT) macieira (DOT) info     ICQ UIN: 1967141   PGP/GPG: 0x6EF45358; fingerprint: De:  Carlos Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)if-then em script nãofunciona Data:  Sat, 05 Jun 2004 22:32:57 -0300 /sbin/ifconfig | head -n2 | tail -1 | grep -E "inet" | cut -d: -f 2 10.10.10.10  Bcast /sbin/ifconfig |grep Bcast |awk '{print $2}' |cut -d ":" -f2 10.10.10.10 De qualquer forma a linha estava errada no seu conjunto, ja que ele queria o ip puro e ele estava vindo com algo mais. ******************************************************** De:  netmask@webset.net Para:  rdmenor@ig.com.br Cc:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)como se usa o ping em um script. Data:  Thu, 24 Jun 2004 14:17:04 -0300 (BRT) rdmenor@ig.com.br disse: > Eu estou tentando fazer um script para vetificar se a conexao com a Existem duas maneiras... a) Testando pelo codigo de retorno (0=ok / 1=nao responde / 2=nao resolve dns) ping -c 2 www.veloxzone.com.br 1>/dev/null 2>&1 if [ $? -eq 0 ]; then   (ok) fi b) Testando se teve ou nao resposta if [ $(ping -c 2 www.veloxzone.com.br | grep "bytes from") != "" ]; then   (ok) fi -- --< Mauricio Teixeira --< netmask {at} webset {dot} net - Maceió/AL --< Analista TI (Linux) e Telecom (Cyclades, Cisco e Nortel) ******************************************************** De:  Carlos Para:  linux-br@bazar2.conectiva.com.br Assunto:  RE: (linux-br)como se usa o ping em um script. Data:  Thu, 24 Jun 2004 13:28:22 -0300   '>'  '>'Eu estou tentando fazer um script para vetificar se a conexao com a internet  '>'  '>'esta navegando.  '>'como faço para user o ping num script?  '>'+ ou - isso...:  '>'if (ping www.veloxzone.com.br)  '>'then  '>'   exit  '>'else  '>'   /root/autentica.sh  '>'fi #!/bin/bash # Envia 3 requisicoes de ping a veloxzone, se retonar # OK sai do script, senao executa autentica.sh ping -c 3 www.veloxzone.com.br if [ $? -eq 0 ] ; then        exit 0 else        /root/autentica.sh fi ******************************************************** De:  Carlos Para:  Everton Lima Horst , linux-br@bazar2.conectiva.com.br Assunto:  RE: (linux-br)Melhorar Script zshell Data:  Thu, 8 Jul 2004 11:09:20 -0300   '>'Pessoal, eu tenho um script q testa todos meus clientes atraves de um ping  '>'  '>'/usr/local/bin/pinga_tudo.sh  '>'  '>'ele da um cat em um arquivo "ips.txt" onde ta todos os meus clientes lah,  '>'ele pinga um por um e me retorna, se respondeu o ping OK caso nao FALHOU  '>'  '>'so q quero as vezes testar um cliente q ta quase no fim da lista, e demora  '>'ateh chegar lah.. gostaria de implementar no meu script um tipo de comando  '>'adicional no prompr, ex.:  '>'  '>'- para testar todos basta # ./pinga_tudo.sh  '>'  '>'- se quiser testar um qualquer # ./pinga_tudo.sh cliente  '>'  '>'se alguem puder ajudar... OBS.: eh ZSH  '>'  '>'[]`s  '>'Eveton  Voce pode fazer um case, ex: ###################### case $1 in          -client)             if [ $# -ne 2 ] ; then                echo "Use: $0 [-client ip]"                exit 1             fi             pingar=$(cat arquivo |grep $2)             ping $pingar ;;            *)             echo "Use: 0$ [-client ip]" esac ####################### Essa é apenas uma idéia, nao vi seu script para fazer algo mais adequado. Qualquer coisa me envie ele que eu acerto pra voce.  Abracos ******************************************************** De:  Thiago Macieira Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)Ajuda em shell-script Data:  Sun, 12 Sep 2004 17:59:04 -0300 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Listas Inter.Net wrote: >#Checa se tabela.txt esta vazia >if [ -z /home/carlos/tabela.txt ] Isso testa se "/home/carlos/tabela.txt" é uma string vazia: $ test -z /dev/null; echo $? 1 $ test -z ""; echo $? 0 Se você quer testar se o arquivo está vazio, tente assim: $ ls -l /home/carlos/tabela.txt | awk '{print $5}' - --   Thiago Macieira  -  Registered Linux user #65028    thiago (AT) macieira (DOT) info     ICQ UIN: 1967141   PGP/GPG: 0x6EF45358; fingerprint: ******************************************************** De: Anderson Lizardo Responder A: Anderson Lizardo Para: Márcio Rodrigo Monteiro Cc: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)script para leitura de arquivos Data: Fri, 11 Mar 2005 15:09:23 -0400 On Wed, 9 Mar 2005 11:51:19 -0300, Márcio Rodrigo Monteiro wrote: > neste comando > if [ `ls -1 /usr/local/jabber-1.4.2/spool/im.ceara.gov.br/$2.*.xml | > wc -l` -gt 0 ] ; > quando no meu diretorio nao existe o arquivo com o nome do segundo > parametro passado ($2), da um erro dizendo que nao existe nenhum > arquivo com esse nome. o que eu gostaria era que esse erro nao fosse > imformado na tela. tentei colocando 2> /dev/null e outras coisas mas > nao consegui, devo ter feito alguma coisa errada. Olá, Teste usar esta linha: if [ `ls -1 /usr/local/jabber-1.4.2/spool/im.ceara.gov.br/$2.*.xml 2>/dev/null | wc -l` -gt 0 ] ; Note o local onde "2>/dev/null" é colocado. -- Anderson Lizardo ******************************************************** ******************************************************** ********************************************************