Shell Script – Estrutura condicional

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!

Share Button

CC BY-NC-SA 4.0 Shell Script – Estrutura condicional by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.