As formas canônicas padrão (POSIX sh e utilities) legíveis seriam:
-
string comparação:
if [ "$a" != 0 ] || [ "$b" != 100 ]; then...
-
decimal inteiro comparação (0100 é 100, se espaços em branco à esquerda são ignorados ou não dependem da implementação embora).
if [ "$a" -ne 0 ] || [ "$b" -ne 100 ]; then...
-
Comparação
inteiro (0x64, 0144 são 100 (o modo POSIX tem que ser ativado para alguns shells para octais). Dependendo do shell 100.0, 1e2, 50 + 50, (
RANDOM
0.003% do tempo) ... será também):if [ "$((a != 0 || b != 100))" -ne 0 ]; then...
No entanto, se o conteúdo das variáveis fizer com que a expansão aritmética falhe com um erro de sintaxe, isso fará com que o shell seja abortado, portanto você pode querer executá-lo em uma subshell para considerar isso.
if ([ "$((a != 0 || b != 100))" -ne 0 ]); then
Você provavelmente não deve usar esse formulário de qualquer maneira, se o conteúdo das variáveis não estiver sob o seu controle, pois isso seria um vulnerabilidade arbitrária de execução de comandos em muitos shells (
bash
,ksh
,zsh
) (por exemplo, com valores de$a
likex[$(reboot)]
).
Qual você escolherá depende do conteúdo das variáveis e do que você quer que elas sejam. Se você souber que eles contêm números inteiros decimais em sua forma canônica, todos os 3 serão equivalentes.
Em qualquer caso, evite os operadores -a
/ -o
test
que depreciado e não confiável no caso geral (não aqui, se você tem controle sobre o conteúdo das variáveis).