Dando continuidade aos posts de Shell Script, agora iremos falar sobre Estrutura Condicional, para quem já desenvolve não é nenhuma novidade, já para quem não esta tão habituado com o termo seria os if e else das linguagens de ou ainda melhor é onde você irá “testar” uma condição e o script ou programa irá dizer se aquela condição é verdadeira ou falsa, 1 ou 0, true ou false enfim ae depende do que você quer fazer.
Em Shell script declaramos a estrutura de seguinte maneira:
if [ CONDICAO ]; then # SE SATISFAZ ENTRA AQUI else # SE NAO SATISFAZ ENTRA AQUI fi
ou
if [ CONDICAO ]; then # SE SATISFAZ ENTRA AQUI elif [ OUTRA CONDICAO ]; then # SE SATISFAZ ENTRA AQUI else # SE NAO SATISFAZ ENTRA AQUI fi
Ok, é simples não é? Porém diversas combinações podem ser feitas usando variáveis, test ou [] e lógicas tornando um script simples ou complexo porém poderoso, vamos ao primeiro exemplo no caso ifelseEx1.sh:
#!/bin/bash PARAM1=$1 if [ -d $PARAM1 ]; then echo "Voce informou um diretorio!" elif [ -f $PARAM1 ] then echo "Voce informou um arquivo!" else echo "Eh apenas um texto!" fi
Muito simples, usando apenas $1 como sendo um parâmetro informado a frente no nome do script na chamada, e a estrutura de if, elif e else. Onde a ideia é analisar o que foi passado e definir se foi passado o caminho de um diretório, arquivo ou uma string.
Saída:
cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx1.sh /home/cleiton/ar_condicionado.png Voce informou um arquivo! cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx1.sh /home/cleiton/ Voce informou um diretorio! cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx1.sh Cleiton Eh apenas um texto! cleiton@linuxVM:~/projetos/shell script$
No script podemos ver que o test ou o que estiver entre [ ] irá checar a condição, então usamos -d que verifica se é um diretório, -f que verifica se é um arquivo, caso não seja nenhum dos dois descartamos dizendo que foi apenas uma string que foi passada, é claro que isso poderia ser bem mais aperfeiçoado.
Agora vamos a outro exemplo, desta vez criaremos dois arquivos, arquivo1.txt sem nada e o arquivo2.txt com a frase “Que calor é esse!” (hehe). E vamos fazer mais alguns testes agora no script ifelseEx2.sh:
#!/bin/bash PARAM1=$1 # ! NOT (NAO) # -e Verifica se existe if [ ! -e $PARAM1 ]; then echo "Arquivo nao existe" # -f Verifica se eh arquivo. # -a Logica AND (E) # -s Verifica se o arquivo é maior que zero elif [ -f $PARAM1 -a -s $PARAM1 ] then echo "Voce informou um arquivo e ele nao esta vazio." elif [ ! -f $PARAM1 ] then echo "O que voce informou nao eh um arquivo!" else echo "Voce informou um arquivo e ele esta vazio." fi
Saída:
cleiton@linuxVM:~/projetos/shell script$ ls -lh arquivo*.txt -rw-r--r-- 1 cleiton cleiton 0 Fev 5 19:59 arquivo1.txt -rw-r--r-- 1 cleiton cleiton 19 Fev 5 19:59 arquivo2.txt cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx2.sh arquivo1.txt Voce informou um arquivo e ele esta vazio. cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx2.sh arquivo2.txt Voce informou um arquivo e ele nao esta vazio. cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx2.sh arquivo3.txt Arquivo nao existe cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx2.sh /home/cleiton/ O que voce informou nao eh um arquivo! cleiton@linuxVM:~/projetos/shell script$
Vamos analisar agora, desta vez usei as opções -e que verifica se o que foi passado existe, no caso verifica se o arquivo existe, porém eu utilizei um ! antes, isso é negação (não) então seria se o arquivo não existe e ele exibe Arquivo não existe na tela, depois temos outra condição e logica com -f que vimos vê se se é um arquivo, -s ele verifica se o arquivo é maior que zero (tamanho) e o -a é para a logica AND (E), então a logica seria a seguinte:
[ -f $PARAM1 -a -s $PARAM1 ]
Se é um arquivo E se o arquivo é maior que zero.
Agora um outro exemplo um pouco mais complexo mas bem comentado para facilitar ifelseEx3.sh
#!/bin/bash ARQ1=$1 ARQ2=$2 # -ot O arquivo eh mais antigo # -nt O arquivo eh mais novo # -ef E o mesmo arquivo if [ $ARQ1 -ot $ARQ2 ]; then echo "O arquivo $ARQ1 eh mais antigo que o $ARQ2" ARQ_NOVO=$ARQ2 else echo "O arquivo $ARQ2 eh mais antigo que o $ARQ1" ARQ_NOVO=$ARQ1 fi # Mostrando qual arquivo iremos analisar as permissoes echo -e "nPortanto o arquivo a ser analisado eh: $ARQ_NOVOnn" # Verificando se nao eh o mesmo arquivo if [ $ARQ1 -ef $ARQ2 ]; then echo "Eh o mesmo arquivo!" exit 0 fi # Exibindo o usuario no qual vamos verificar as permissoes echo -e "Permissao do arquivo do usuario: $USERnn" # Verificando as permissoes # -x Execucao -w Gravacao -r Leitura # Testa se o arquivo tem permissao de execucao, leitura e gravacao if [ -x $ARQ_NOVO -a -r $ARQ_NOVO -a -w $ARQ_NOVO ]; then echo "Permissao: rwx [TOTAL]" # Senao testa se o arquivo tem permissao de execucao e gravacao ! nega para leitura elif [ -x $ARQ_NOVO -a ! -r $ARQ_NOVO -a -w $ARQ_NOVO ]; then echo "Permissao: -wx [GRAVACAO + EXECUCAO]" # Senao testa se o arquivo tem permissao de execucao e leitura ! nega para gravacao elif [ -x $ARQ_NOVO -a -r $ARQ_NOVO -a ! -w $ARQ_NOVO ]; then echo "Permissao: r-x [LEITURA + EXECUCAO]" # Segue a logic... elif [ -x $ARQ_NOVO -a ! -r $ARQ_NOVO -a ! -w $ARQ_NOVO ]; then echo "Permissao: --x [EXECUCAO]" # Segue a logica... elif [ ! -x $ARQ_NOVO -a -r $ARQ_NOVO -a ! -w $ARQ_NOVO ]; then echo "Permissao: r-- [LEITURA]" # Segue a logica... elif [ ! -x $ARQ_NOVO -a ! -r $ARQ_NOVO -a -w $ARQ_NOVO ]; then echo "Permissao: -w- [GRAVACAO]" elif [ ! -x $ARQ_NOVO -a -r $ARQ_NOVO -a -w $ARQ_NOVO ]; then echo "Permissao: rw- [LEITURA + GRAVACAO]" else echo "Permissao: --- [SEM PERMISSAO]" fi
Saída:
cleiton@linuxVM:~/projetos/shell script$ ls -lh arquivo*.txt -rw-r--r-- 1 cleiton cleiton 0 Fev 5 19:59 arquivo1.txt -rw-r--r-- 1 cleiton cleiton 19 Fev 5 19:58 arquivo2.txt -r--r--r-- 1 cleiton cleiton 19 Fev 8 13:22 arquivo3.txt --wxr--r-- 1 cleiton cleiton 19 Fev 8 14:02 arquivo4.txt cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx3.sh arquivo1.txt arquivo2.txt O arquivo arquivo2.txt eh mais antigo que o arquivo1.txt Portanto o arquivo a ser analisado eh: arquivo1.txt Permissao do arquivo do usuario: cleiton Permissao: rw- [LEITURA + GRAVACAO] cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx3.sh arquivo3.txt arquivo2.txt O arquivo arquivo2.txt eh mais antigo que o arquivo3.txt Portanto o arquivo a ser analisado eh: arquivo3.txt Permissao do arquivo do usuario: cleiton Permissao: r-- [LEITURA] cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx3.sh arquivo4.txt arquivo3.txt O arquivo arquivo3.txt eh mais antigo que o arquivo4.txt Portanto o arquivo a ser analisado eh: arquivo4.txt Permissao do arquivo do usuario: cleiton Permissao: -wx [GRAVACAO + EXECUCAO] cleiton@linuxVM:~/projetos/shell script$
Acho que não preciso comentar muito, pois inseri comentários no código mas como vimos é possível eu checar as permissões (leitura,gravação e execução) de arquivos e diretórios, então eu fiz uma brincadeira para verificar dois arquivos passados dizer qual é mais antigo, pegar o mais novo e mostrar na tela as permissões para o usuário corrente.
Um ultimo script, agora usando o test e [ ] em um mesmo script e mais alguns parâmetros interessantes, ifelseEx4.sh.
#!/bin/bash NAME="Dir" PERMISSAO="771" PERM_DESC="rwxrwx--x" # Gera um numero randomico NUM1=$(echo $RANDOM) # Aguarda 1s sleep 1 # Gera outro numero randomico NUM2=$(echo $RANDOM) echo -e "ID1: $NUM1nID2: $NUM2nn" # Verifica se a primeira variavel eh maior ou igual a segunda variavel if [ $NUM1 -ge $NUM2 ]; then echo -e "t$NUM1 eh maior que $NUM2" else echo -e "t$NUM1 eh menor que $NUM2" fi # Pegando o caminho do mkdir MKDIR=$(which mkdir) # Testo se mkdir possui permissao para executar no usuario atual, caso contrario # || ira sair test -x $MKDIR || exit 0 # Se chegou aqui eh porque passou no teste entao configuro o comando mkdir para # /bin/mkdir -p -m 771, muito legal esse parametro de setar as permissoes na criacao MAKE_DIR="$MKDIR -p -m $PERMISSAO" # Chamo o MAKEDIR passo o NOME que dei na variavel NAME e junto o numero gerado $MAKE_DIR $NAME$NUM1 $MAKE_DIR $NAME$NUM2 # Se o comando anterior executou sem problemas # Usamos o $? para verificar if [ $? -eq 0 ]; then echo -e "n(*)Diretorios criado com sucesso!n" # Listo os diretorios ls -l | grep $NAME # Mostro para o usuario as permissoes que foram setadas na criacao echo -e "n(*)Permissoes: $PERMISSAO $PERM_DESC" else echo -e "n(*)Ocorreu um erro na criacao dos diretorios $NAME$NUM1 e $NAMENUM2!" fi
Neste ultimo script fiz uso de recursos do post anterior Shell Script: Variáveis, no começo sem grandes novidade criei algumas variáveis com alguns dados, logo em seguida duas variáveis $NUM1 e $NUM2 que irão gerar e armazenar dois números randômicos, mostro na tela e faço uma comparação onde -ge verifica se o primeiro dado é maior ou igual ao segundo e informa o operador.
Agora começa a ficar legal, o comando which irá pegar o caminho do binário mkdir e armazenar em $MKDIR, logo abaixo eu uso o test onde ele verifica se o $MKDIR possui permissão de execução se tiver maravilha ele continua caso contrario || irá sair do nosso script ignorando o que tiver abaixo.
Se estiver ok, uma nova variável chamada $MAKE_DIR sera criado com o conteúdo do caminho /bin/mkdir mais alguns parâmetros para criar diretórios, no caso em -m passo a permissão de criação baseada na variável no topo do script, e logo em seguida chama $MAKE_DIR e passa a variável $NAME, $NUM1 e $NUM2 para a criação do diretório, após executar um if vem logo em seguida com o $? para verificar o status do comando anterior de bem sucedido ou igual a 0 ele exibe uma mensagem na tela de exite e lista os diretórios criados caso contrario irá exibir uma mensagem que ouve um erro na execução do comando.
Saída:
cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx4.sh ID1: 28928 ID2: 8346 28928 eh maior que 8346 (*)Diretorios criado com sucesso! drwxrwx--x 2 cleiton cleiton 4096 Fev 13 23:09 Dir28928 drwxrwx--x 2 cleiton cleiton 4096 Fev 13 23:09 Dir8346 (*)Permissoes: 771 rwxrwx--x cleiton@linuxVM:~/projetos/shell script$
Vamos alterar a linha test -x $MKDIR || exit 0 para test -d $MKDIR || exit 0 e ver o que acontece.
cleiton@linuxVM:~/projetos/shell script$ ./ifelseEx4.sh ID1: 14821 ID2: 1539 14821 eh maior que 1539 cleiton@linuxVM:~/projetos/shell script$
No caso ele tem que verificar se é um diretório, como mkdir não é e sim um binário ele irá gerar uma exceção e sair do programa.
Ficou extenso este post porém detalhei bem os passos para nos próximos posts consiga focar mais em scripts com estas características sem ter que abordá-las, uma tabela com as opções para test e [ ] pode ser visualizada abaixo:
Operadores para números | |
-lt | Verifica se é menor |
-gt | Verifica se é maior |
-le | Verifica se é menor ou igual |
-ge | Verifica se é maior ou igual |
-eq | Verifica se é igual |
-ne | Verifica se é diferente |
Operadores para Texto | Usa-se ” ” caso utilizar valor |
-n | Verifica se não é nula |
-z | Verifica se é nula |
!= | Verifica se é diferente |
= | Verifica se é igual |
Operador para logica | |
! | Logica NOT ou NÃO |
-o | Logica OU, (OR) ou || |
-a | Logica E, (AND) ou && |
Operador para arquivos/diretórios | |
-d | Verifica se é diretório |
-f | Verifica se é arquivo |
-e | Verifica se existe |
-O | Verifica se o dono do arquivo é o usuário que esta executando |
-s | Verifica se o arquivo não esta vazio |
-L | Verifica se é um link-simbólico |
-r | Verifica se o usuário tem permissão de leitura |
-w | Verifica se o usuário tem permissão de gravação |
-x | Verifica se o usuário tem permissão de execução |
-nt | Verifica se é mais recente |
-ot | Verifica se é mais antigo |
-ef | Verifica se é igual |
Utilizamos varias delas e outras foram adicionadas, e existem mais algumas mas no momento certo será abordado.
Até a próxima!
Shell Script – Estrutura condicional by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.