Aula 7.19: Estruturas de fluxo condicionais Linux shell

     

Este artigo faz parte do projeto #LTCode

A shell usa as mesmas construções para controle de fluxo que linguagens de programação de alto nível. Exemplo de uso de if else:

O que o comando if faz é avaliar o comando especificado verificando seu status de saída. No exemplo da foto acima foi executado em linha de comando, portanto você pode usar o comando !-2 quando quiser repetir o penúltimo comando. Altere o valor de 2 para repetir comandos mais antigos.

Todo comando retorna para a shell um valor (de 0 a 255) indicando sucesso (0) ou falha em sua execução (diferente de 0). Existem dois comandos internos da shell extremamente simples que apenas terminam com status 0 ou 1. 

O comando true sempre executa com sucesso retornando 0 e o comando false sempre executa sem sucesso retornando 1.

O comando mais frequentemente usado com comandos condicionais é o test, pois faz uma variedade de verificações/comparações. Como ilustra a imagem acima o comando possui duas formas equivalentes test ou [ ]. A expressão é avaliada em verdadeiro ou falso, retornando 0 quando a expressão é verdadeira e 1 quando é falsa. 

O comando test é capaz de avaliar expressões com arquivos, strings e inteiros. Abaixo está listado as expressões que você pode utilizar entre [ ] para serem avaliadas:

Expressões com arquivos:

Se true file1 e file2 possuem mesmo número de inode (hardlink).

Se true file1 é mais novo que file2.

Se true file1 é mais velho que file2.

Se true arquivo existe e é um arquivo/dispositivo de bloco-especial.

Se true arquivo existe e é um arquivo/dispositivo de caractere-especial.

Se true arquivo existe e é um diretório.

Se true arquivo existe arquivo existe.

Se true arquivo existe e é um arquivo regular.

Se true arquivo existe e é setgid.

Se true arquivo existe e pertence ao ID do grupo efetivo.

Se true arquivo existe e tem o stick bit definido.

Se true arquivo existe e é um link simbólico.

Se true arquivo existe e pertence ao ID do usuário efetivo.

Se true arquivo existe e é um pipe nomeado.

Se true arquivo existe e é legível pelo usuário efetivo.

Se true arquivo existe e tem tamanho maior que zero.

Se true arquivo existe e é socket de rede.

É um descritor de arquivos redirecionado de/para o terminal.

Se true arquivo existe é setuid.

Se true arquivo existe e é gravável pelo usuário efetivo.

Se true arquivo existe e é executável pelo usuário efetivo.

Expressões com strings:

Se true a string está definida, não é null.

Se true o tamanho da string é maior que zero.

Se true o tamanho da string é zero.

Se true string1 e string2 são iguais.

Se true string1 e string2 são iguais.

Se true string1 e string2 não são iguais.

Se true string1 vem depois de string2 se ordenadas.

Se true string1 vem antes de string2 se ordenadas.

Expressões com inteiros:

Se true integer1 é igual a integer2.

Se true integer1 é diferente de integer2.

Se true integer1 é menor ou igual a integer2.

Se true integer1 é menor que integer2.

Se true integer1 é maior ou igual a integer2.

Se true integer1 é maior que integer2.

Versões recentes do bash adicionam um comando composto que age como um aprimoramento do comando test.

O comando [[ ]] é muito similar ao comando test (suporta todas as suas expressões), mas adiciona uma nova comparação de strings.

retorna verdadeiro se string1 casa com a expressão regular estendida regex.

Outra funcionalidade do comando [[ ]] é que o operador == suporta o casamento de padrões da mesma forma que expansão de arquivos.

O bash também proporciona o comando composto (( )) que é útil para realizar operações inteiras, suporta o conjunto completo para avaliações aritméticas. Esse comando é útil para fazer testes verdade aritméticas, resultando em verdadeiro se a avaliação aritmética for não-zero.

Também é possível combinar expressões para criar avaliações mais complexas usando operadores lógicos. Existem três operadores lógicos (AND, OR e NOT) para os comandos test, [[ ]] e (( )). Cada um têm sintaxe diferenciada:

Operação: AND

test e [ ]: -a

[[]] e (()): &&

Operação: OR

test e [ ]: -o

[[]] e (()): ||

Operação: NOT

test e [ ]: -a

[[]] e (()): &&

Para negar uma combinação de expressões, deve-se usar parênteses envolvendo as expressões.

Bash provê dois operadores que podem realizar desvios. 

comando1 && comando2

&& (AND): o comando2 só é executado se o comando1 executar com sucesso (status de saída igual a zero).

comando1 || comando2

|| (OR): o comando2 só é executado se o comando1 executar sem sucesso (status de saída diferente de zero).




Source link