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 .