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, (
RANDOM0.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 ]); thenVocê 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$alikex[$(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).