Exemplos de uso do if, linhas de comando e scripts.
Consulte a página do manual, tem a lista de todos operadores lógicos.
man bash
controle de fluxo utilizando if
if [ condição ]; then #seus comandos aqui fi if [ condição ] then #seus comandos aqui fi if [ condição ] then #seus comandos aqui else #seus comandos aqui fi if [ condição ];then #seus comandos aqui else #seus comandos aqui fi if [ condição ];then #seus comandos aqui elif #seus comandos aqui else #seus comandos aqui fi
Operadores if em testes com arquivos.
-d se é diretório -f se o arquivo existe -o dono do arquivo (owner) -r se tem permissão leitura -w se tem permissão para gravar -x se executável -z se arquivo vazio
Veja também sobre test, comparar $UID com zero para saber se está executando como root e etc...
Cada comando executado em shell tem um codigo de retorno, útil em script para conferir se falhou ou foi executado com sucesso, este resultado fica armazenado na variavel $?
, ele muda a cada comando, tanto faz se foi na linha de comando ou dentro do script, atualizado a cada comando, echo $?
exibe o resultado do ultimo comando, retornando:
0 (zero) significa que o comando anterior foi executado com sucesso. 1 (um) e qualquer valor diferente de zero ( != 0) indica que ocorreu algum erro. 2 erro nos comandos do script, geralmete erro de sintaxe, digitação, 127 = command not found, quando digita comando não existente.
Exemplos:
[zago@faqcl10 tmp]$ touch meuteste [zago@faqcl10 tmp]$ echo $? 0 [zago@faqcl10 tmp]$ ls meusdoc ls: meusdoc: Arquivo ou diretório não encontrado [zago@faqcl10 tmp]$ echo $? 1 [zago@faqcl10 tmp]$ ls meuteste [zago@faqcl10 tmp]$ echo $? 0
Explicando:
retornou 1 (um) quando falhou o comando "ls meusdoc" e retornou zero para os demais comandos que foram executados sem problemas.
Cuidado para não repetir "echo $?" porque ele também é um comando e altera o retorno, portanto vale somente o primeiro "echo $?" depois do comando.
Alguns exemplos utilizando $?
cat /tmp/testar #!/bin/bash mkdir /tmp/teste if [ $? -eq 0 ];then echo $? echo "comando executado com sucesso!" else echo $? echo "falha na execução do comando." exit fi
Neste exemplo a linha "if [ $? -eq 0 ]" verifica o retorno do comando "mkdir /tmp/teste", se foi bem sucedido ou não.
Na primeira vez que executar retorna zero de bem suscedido, depois passa a retornar 1 porque o diretório já existe e o comando falha na criação dele.
Invertendo o teste, testando se o retorno é diferente de zero, aplicando ls em um diretório que não existe, portanto tem que retornar valor diferente de zero.
#!/bin/bash ls /home/dirquenaotem if [ "$?" != 0 ] then #seus comandos aqui echo "Erro - Saindo" exit fi resultado: bash -xv testeif.sh #!/bin/bash ls /home/dirquenaotem + ls /home/dirquenaotem ls: /home/dirquenaotem: Arquivo ou diretório não encontrado if [ "$?" != 0 ] then #seus comandos aqui echo "Erro - Saindo" exit fi + '[' 2 '!=' 0 ']' + echo 'Erro - Saindo' Erro - Saindo + exit
man if
encontra duas opções. -e
e -f
-e file True if file exists. -f file True if file exists and is a regular file.
-e é mais abrangente, funciona para arquivo, diretório e link.
-f é mais especifico, verifica somente arquivo normal, não testa diretórios e links.
if [ -e "/tmp/arqteste" ]; then echo "OK arquivo existe"; fi
testar se existe o arquivo /tmp/arqteste.txt, Retorna verdadeiro mesmo com arquivo vazio
touch /tmp/arqteste.txt
#!/bin/bash arquivo='/tmp/arqteste.txt' if [ -f $arquivo ] then echo "OK arquivo encontrado" else echo "falhou - arquivo nao encontrado" fi
Testar com -e
e aplicar comandos....
#!/bin/bash if [ -e arqtemp.txt ] then #seus comandos aqui quando existir o arquivo. echo "arquivo encontrado." else #seus comandos aqui quando não existe o arquivo. echo "arquivo _não_ encontrado." fi Informando o caminho. #!/bin/bash if [ -e /tmp/arqtemp.txt ] then #seus comandos aqui quando existir o arquivo. echo "arquivo encontrado." else #seus comandos aqui quando não existe o arquivo. echo "arquivo _não_ encontrado." fi
Colocar o tamanho do arquivo em variavel para comparações.
Gravar CD e testar tamanho da ISO.
#!/bin/bash # pegar tamanho do arquivo arqtam=$(du cl10_cd1.iso | awk '{print $1}') # comparar se maior que 600000 if [ $arqtam -gt 600000 ]; then echo " arquivo maior que o limite do CD" exit 1 else echo " tamanho OK, gravando CD" # comandos para gravar CD. fi
Testar se está executando o script como root.
if test $UID = 0
verifica se está executando o script como root, quando executado por outro usuário, executa as linhas que vem depois do (else) e sai, neste exemplo emite o aviso que requer poderes de root.
Exemplo de script para criar usuários e testar se está sendo executado pelo root.
#!/bin/bash if test $UID = 0 then # criar usuário via linha de comando muda conforme a distro, ajuste para sua instalação. useradd -m $1 # suse 10.1 # adduser $1 # CL 10 echo $2 | passwd $1 --stdin echo echo "Usuário $1 adicionado com sucesso" else echo Pra criar usuários requer poderes de root. fi
Este script está ajustado para SUSE 10.1. Linha de comando para executar o script com nome caduser, criar o usuário zago com a senha minhasenha, como root no console a linha de comando ficaria assim:
sh caduser zago minhasenha
Outro exemplo, testar se está executando com usuário diferente de root.
#!/bin/bash if [ $UID != 0 ] then echo "Usuário diferente de root" exit fi
Ideal em scripts que deseja determinar a hora de inicio e fim, testa toda hora e executa os comandos do script.
Testar o conteúdo da variável, deve retonar somente a hora cheia como neste exemplo que foi executado às 20:08 horas.
HATUAL=`date +%H` echo $HATUAL
retorna 20
Exemplo para disparar bittorrent as 19:00 horas e matar o processo as 07:00 horas.
Este script não inicia bittorrent pelo crontab, funciona com outras aplicaões, em breve procuro pelo erro do torrent e removo este aviso.
HATUAL=`date +%H` if [ $HATUAL = "19" ]; then #seus comandos aqui, exemplo para download SUSE 10.1 em 5 CD. cd /home/zago btdownloadheadless --url http://download.opensuse.org/distribution/SL-10.1/SUSE-Linux-10.1-GM-i386.torrent fi # matar o processo if [ $HATUAL = "07" ]; then kill -9 $(ps ax|grep "python"|awk '{print $1}') fi
Crie o script com o conteúdo acima, salve no diretório /etc/cron.hourly, torne executável com chmod 755, para script com nome torrent.sh execute.
chmod 755 /etc/cron.hourly/torrent.sh
Também precisa trocar o endereço do torrent para o que deseja baixar, acertar o hora de iniciar e matar o processo.
Pegar o do dia da semana em formato numérico
MNUMDIA=$(echo `date +%u`)
echo $MNUMDIA
para quinta-feira retorna o numero 4
Onde:
1=segunda 2=terça 3=quarta 4=quinta 5=sexta 6=sábado 7=domingo
Exemplo de rotina para testar em script se o dia é igual a Domingo (7), caso seja, emite uma mensagem e sai do script sem executar os demais comandos, ideal para rotinas de backup com exclusão do Domingo, inclua esta rotina no inicio do seu script, ajuste a mensagem a seu modo.
#!/bin/bash MNUMDIA=$(echo `date +%u`) if [ $MNUMDIA = "7" ]; then echo "Domingo não é dia de trabalho nem de backup, saindo do script" echo "Domingo não tem backup, saindo do script" >> /tmp/logbackup.txt exit 1 fi
Testar dois dias da semana, neste exemplo 6 para sabado e 7 para domingo, nestes dias executa dos comandos dentro do if, neste exemplo exibe uma mensagem, grava um registro em logbackup.txt e sai do script sem executar os demais comandos.
#!/bin/bash MNUMDIA=$(echo `date +%u`) if [ $MNUMDIA = "6" -o $MNUMDIA = "7" ]; then # seus comandos aqui para executar nos dias testados pelo if. echo "Aos sabados e domingos não tem backup, saindo do script" echo "hoje é sab ou dom, saindo do script" >> /tmp/logbackup.txt exit 1 fi
Tenho alguns scripts que quero executar em maquinas especificas, a forma mais prática que encontrei, amarrar o script ao MAC ADRESS da placa de rede, tem outras opções, pelo MAC é uma boa maneira de identificar a maquina.
Conferir se realmente é igual, no exemplo abaixo, compara o MAC da maquina com este "00:08:54:2C:DD:FD"
#!/bin/bash MEUMAC=`LC_ALL= LANG= /sbin/ifconfig eth0 | grep HWaddr | awk '{print $5}'` if [ $MEUMAC = "00:08:54:2C:DD:FD" ]; then echo "estou na maquina que deve rodar o script" #seus comandos aqui else echo "MAC não confere, maquina diferente, altere o MAC no script" fi
Outra forma de testar, se o grep achou o MAC, se pegou alguma informação ou não.
#!/bin/bash meumac=`ifconfig | grep "00:08:54:2C:DD:FD"` if [ -n "$meumac" ]; then echo "estou na maquina que deve rodar o script" #seus comandos aqui fi
if [ -n "$meumac" ]
permite testar se variável meumac tem alguma informação diferente de vazio ou nulo, -n "$meumac" = não vazio nem nulo
, se tiver alguma informação é porque o grep encontrou o MAC especificado. portanto identificando a maquina.
Como não tem (else), se não conferir com o MAC, não executa os comandos e sai sem mensagem.
if [ $IPATUAL != $ARQUIVOIP ]
verifica se $IPATUAL é diferente de $ARQUIVOIP
Script que utiliza esta comparação.
[zago@mailserv zago]$ cat /tmp/ipteste #!/bin/bash cd /tmp ARQUIVOIP=`cat /tmp/iparquivo` # ultimo ip enviado # estação com IP 192.168.1.3, precisa buscar o IP na net wget http://whatismyip.com/ -q -O ipatual cat ipatual | grep "<TITLE" | awk {'print $3'} > /tmp/ipatual.txt IPATUAL=`cat /tmp/ipatual.txt` # comparar IP atual com iparquivo echo $IPATUAL echo $ARQUIVOIP if [ $IPATUAL != $ARQUIVOIP ] then echo $IPATUAL # enviar e-mail DESTINATARIO="zagolinux@gmail.com" ASSUNTO="Novo IP de .." MENSAGEM="Novo IP $IPATUAL" echo "$MENSAGEM" | mail -s "$ASSUNTO" "$DESTINATARIO" echo $IPATUAL > /tmp/iparquivo fi
Comparar datas de arquivos para saber qual é mais recente.
if test arq1 -nt arq2 ; then #seus comandos aqui para quando arq1 for mais novo que arq2 echo "arq1 é mais novo que arq2" fi
#!/bin/bash MVAR="LETRAS" if [[ ${MVAR:0:1} = [A-Za-z] ]]; then echo "o primeiro caracter é uma letra em ${MVAR:0:1}" #seus comandos aqui else echo "Não é letra em ${MVAR:0:1}" fi
No exemplo acima compara toda faixa de de A a Z e de a a z.
if com expressões regulares funciona melhor com [[ ]]
Exemplo para script que requer confirmação, com a tecla s ou S prossegue, qualquer outra tecla encerra o script.
#!/bin/bash echo "Confirma [s/n]: " read -n1 MCONFIRMA if [ "$MCONFIRMA" = "S" -o "$MCONFIRMA" = "s" ]; then # seus comandos aqui. echo "confirmado, prosseguindo..." else echo "encerrando script, teclou $MCONFIRMA" exit 1 fi
Para não sair do script remova a linha (exit 1), em lugar da mensagem (confirmado) inclua as linhas de comando; tais como copiar, mover, remover...
-n1 força um enter depois de teclar um caractere, sem ele permite teclar mais de um caracter e precisa teclar enter, veja o que diz o manual.
-n nchars
read returns after reading nchars characters rather than waiting for a complete line of input.
De outra forma mais simplificado, sem else e validando somente s minusculo.
#!/bin/bash echo "Confirma [s/n]: " read -n1 MCONFIRMA if [ "$MCONFIRMA" = "s" ]; then # seus comandos aqui. echo "confirmado, executando..." fi
Conferir se o numero informado está entre determinada faixa, exemplo para comparar se 1980 está entre 1970 e 2000
#!/bin/bash MANO=1980 if [ $MANO -ge 1970 -a $MANO -le 2000 ]; then echo "numero dentro na faixa de 1970 a 2000" #seus comandos aqui else echo "numero fora da faixa de 1970 a 2000" fi
test pode ser usado como uma forma de if
test faz parte do pacote coreutils
man test
test - verifica tipos de arquivos e compara valores
alguns exemplos.
MVAR=1 test "$MVAR" -eq 1 && echo IGUAL-1 || echo DIFERENTE-1
Quando o resultado for verdadeiro executa a primeira condição (&& echo IGUAL-1), quando for falso executa a segunda (echo DIFERENTE-1)
Troque echo no exemplo acima pelo comando/ação desejada.
test "$MVAR" -eq 1 && ls /tmp || ls ~/
MVAR=2 test "$MVAR" -eq 1 echo $? 1 MVAR=2 test "$MVAR" -eq 2 echo $? 0