Qual é a sintaxe de uma condição complexa no shell?

9

Se quiser expressar o seguinte teste no shell (sh):

if ( a == 1 && ( b == 1 || b == 2 )) { ... }

Até agora, o melhor que consegui escrever é:

if [[ $a -eq 1 ]]; then
  if [[ $b -eq 1 || $b -eq 2 ]]; then
     ...
  fi
fi

Eu não sei como compor & & e || com precedência correta. O google não me deu nenhuma resposta (os tutoriais apenas fornecem exemplos básicos, se houver)

Qual é a sintaxe para combinar os dois se em um?

    
por Offirmo 10.01.2012 / 17:26

4 respostas

13

Observe que [[ ]] não está em Bourne nem em POSIX sh . Para a verdadeira sintaxe sh , existem várias maneiras de fazer isso.

Usando apenas um par [ ]

if [ 1 -eq "$a" -a \( 1 -eq "$b" -o 2 -eq "$b" \) ]; then
    # ...
fi

ou Evitando as opções% POSI -a e -o 1

if [ 1 -eq "$a" ] && { [ 1 -eq "$b" ] || [ 2 -eq "$b" ]; }; then
    # ...
fi

1 Uma razão para evitar -a e -o é a portabilidade máxima - nem todas as implementações podem processar mais de 4 argumentos, que é exatamente o que você obtém se você encadeia expressões com test e [ e -a .

    
por 10.01.2012 / 17:40
2

Eu tentei alguma sintaxe e descobri que

if [[ $a -eq 1 ]] && [[ $b -eq 1 || $b -eq 2 ]]; then
 ...
fi

está funcionando.

    
por 10.01.2012 / 17:46
2

Outra abordagem POSIX:

if [ "$((a == 1 && ( b == 1 || b == 2 )))" -ne 0 ]; then
  ...
fi
    
por 16.03.2015 / 17:12
0

O jeito certo de fazer isso com um mero shell :

if test 1 -eq "$a" && test 1 -eq "$b" -o 2 -eq "$b"; then 
    ...
fi

Explicação:

test aqui serve como parêntese e -o como lógico ou. Se você tiver uma lógica e dentro do "parênteses" você usaria -a .

Mais sobre isso pode ser encontrado aqui

    
por 16.03.2015 / 17:02

Tags