Declarações condicionais do Bash

2

Quais são os três formatos de instruções condicionais usadas no script do bash?

    
por Jon Doe 07.01.2011 / 05:27

1 resposta

6

A seção relevante do manual do bash lista 5 construções diferentes que podem ser usado para avaliação condicional. Dessas, as construções if , case e [[ .. ]] são provavelmente as mais usadas no código do mundo real, embora a construção (( .. )) seja usada com frequência em scripts que fazem contagem complexa ou outras operações numéricas.

Mas eles não mencionam outra forma muito comum usada para ramificação no bash, que é apenas executar um comando em combinação com avaliação de curto-circuito, por exemplo

grep -q needle haystack.txt && echo "Needle located!" || echo "No dice or needles.";

&& e || são operadores lógicos: "e" e "ou" respectivamente.

Isso é efetivamente o mesmo que

if grep -q needle haystack.txt; then echo "yea"; else echo "nay"; fi;

mas funciona de maneira diferente: na primeira forma, a lógica condicional realmente surge como um efeito colateral do objetivo explícito real do código, que é, pelo menos ostensivamente, avaliar os operadores lógicos. Esse tipo de construção também é comumente visto no código C e JavaScript.

Funciona tomando atalhos: as partes da expressão, por ex. x && y || z , são avaliados da esquerda para a direita. Se o lado esquerdo de um lógico e, e. o x em x && y , avalia como false, bash não se incomoda em avaliar a parte y porque nesse momento já sabe que x && y é falso.

O inverso é verdadeiro para ors lógicos: true || z sempre é avaliado como verdadeiro, não importa o que z seja.

Portanto, se o grep for falso, bash poderá ignorar esse primeiro echo , porque essa parte da expressão não pode ser verdadeira. Então, ele passa para o segundo echo . Por outro lado, se o grep é verdadeiro, o primeiro echo é executado (resultando naquelas palavras sendo, bem, ecoadas ..). Neste ponto, bash é feito, porque qualquer que seja o valor do lado direito do || , o resultado da expressão ainda será verdadeiro.

Para ter uma ideia do modo como o bash trabalha com condicionais, é melhor fazer alguma experimentação na linha de comando. O comando

echo $?;

irá ecoar o código de retorno da declaração anterior. Este é um código de erro, portanto 0 significa true e um valor diferente de zero significa false. É um pouco confuso no começo, mas você se acostuma.

Então você pode fazer, por exemplo

$ (( 1 + 2 == 3 )); echo $?
0
$ (( 1 + 2 == 4 )); echo $?
1

e realize testes semelhantes com a construção [[ .. ]] para ter uma ideia desses blocos básicos de construção. Depois disso, passe para as instruções if e case .

Quanto à resposta à sua pergunta, bem, acho que depende muito do contexto em que foi questionada. Mas entender bem as várias opções deve ajudá-lo a descobrir o que elas estão procurando lá.

    
por 07.01.2011 / 06:28